Description
每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这
种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头
牛被所有的牛认为是受欢迎的。
Input
第一行两个数N,M。 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可
能出现多个A,B)
Output
一个数,即有多少头牛被所有的牛认为是受欢迎的。
Sample Input
3 3
1 2
2 1
2 3
1 2
2 1
2 3
Sample Output
1
HINT
100%的数据N<=10000,M<=50000
这个要求强联通分量+缩点,用链式结构存储才行。
看码:
#include<stdio.h>
int idx;
int ans2;
int low[50001];
int deep[50001],idx2,cnt,t;
int head[50001];
int x[50001],y[50001],z[50001];
int top,f[50001];
int ans[50001];
int num[50001],n,m;
int inz[50001];
int to[50001];
int next[50001];
int min(int x,int y)
{
if(x<y)
return x;
return y;
}
void addedge(int x,int y)
{
to[++idx]=y;
next[idx]=head[x];
head[x]=idx;
}
void tarjan(int x)
{
low[x]=deep[x]=++cnt,z[++top]=x,inz[x]=1;
for(int i=head[x];i;i=next[i])
{
if(!deep[to[i]])
{
tarjan(to[i]);
low[x]=min(low[x],low[to[i]]);
}
else if(inz[to[i]]&&low[x]>deep[to[i]])
low[x]=deep[to[i]];
}
if(low[x]==deep[x])
{
idx2++;
do
{
t=z[top--];
ans[idx2]++;
inz[t]=0;
f[t]=idx2;
}while(x!=t);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x[i],&y[i]);
addedge(x[i],y[i]);
}
for(int i=1;i<=n;i++)
if(!deep[i])
tarjan(i);
for(int i=1;i<=m;i++)
if(f[x[i]]!=f[y[i]])
num[f[x[i]]]++;
for(int i=1;i<=idx2;i++)
if(num[i]==0)
{
if(ans2!=0)
{
printf("0");
return 0;
}
ans2=i;
}
printf("%d",ans[ans2]);
}