ex_078 @ 2019-11-15 11:57:10
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=100010,M=100010;
int n,m;
int cnt;
struct edge
{
int to;
int nxt;
}bian[M*2];
int s[M],t[M];
int w[N];
int first[N];
int cont[N];//表示每个节点上的人数
void add_edge(int s,int e)
{
cnt++;
bian[cnt].to=e;
bian[cnt].nxt=first[s];
first[s]=cnt;
}
int flag1;//起点等于终点
int flag2; //从0的时刻开始
int flag3;;//树退化 成一条链
int ans[N];//每个节点的观察员可观察到的人数
inline int read()
{
int p=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
{
f=-1;
}
c=getchar();
}
while(c>='0'&&c<='9')
{
p=p*10+c-'0';
c=getchar();
}
return p*f;
}
int main()
{
cin>>n>>m;
for(register int i=1;i<=m;i++)
{
int u,v;
u=read();
v=read();
add_edge(u,v);
add_edge(v,u);
}
for(register int i=1;i<=n;i++)
{
w[i]=read();
if(w[i]!=0)
{
flag2=1;
}
}
for(register int i=1;i<=m;i++)
{
s[i]=read();
t[i]=read();
if(s[i]!=t[i])
{
flag1=1;
}
}
if(flag1==0)
{
for(int i=1;i<=m;i++)
{
ans[s[i]]++;
}
for(int i=1;i<=n;i++)
{
if(w[i]!=0)
{
ans[i]=0;
}
}
for(int i=1;i<=n;i++)
{
printf("%d ",ans[i]);
}
return 0;
}
else if(flag2==0)
{
for(int i=1;i<=m;i++)
{
if(s[i]==t[i])
{
ans[s[i]]++;
}
}
for(int i=1;i<=n;i++)
{
printf("%d ",ans[i]);
}
return 0;
}
for(int i=1;i<=m;i++)
{
if(w[t[i]]==t[i]-s[i])
{
ans[t[i]]++;
}
for(int i=1;i<=n;i++)
{
printf("%d ",ans[i]);
}
}
return 0;
}
by ex_078 @ 2019-11-15 11:57:24
只求35分