这个就是强连通,计算出度为0的点就好~
也没森么其它好讲的啦~
提交传送们
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
Sample Output
1
#include<set>
#include<map>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int x,y,next;
}a[110000];int len,first[11000],n,m;
void ins(int x,int y){
len++;a[len].x=x;a[len].y=y;
a[len].next=first[x];first[x]=len;
}
int sta[11000],tp;bool v[11000];
int cnt,belong[11000];
int low[11000],dfn[11000],id,num[11000];
int chu[11000],ru[11000];
void dfs(int x){
low[x]=dfn[x]=++id;
sta[++tp]=x;v[x]=true;
for(int k=first[x];k>0;k=a[k].next){
int y=a[k].y;
if(dfn[y]==0){
dfs(y);
if(low[x]>low[y])low[x]=low[y];
}
else if(v[y]==true){
if(low[x]>dfn[y])low[x]=dfn[y];
}
}
if(low[x]==dfn[x]){
cnt++;
int i;
do{
i=sta[tp--];
belong[i]=cnt;
v[i]=false;
}while(i!=x);
}
}
int main(){
scanf("%d%d",&n,&m);
len=0;memset(first,false,sizeof(first));
cnt=0;memset(v,false,sizeof(v));
memset(dfn,0,sizeof(dfn));
tp=id=cnt=0;
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
ins(x,y);
}
for(int i=1;i<=n;i++)if(dfn[i]==0)dfs(i);
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++)num[belong[i]]++;
for(int i=1;i<=len;i++){
if(belong[a[i].x]!=belong[a[i].y]){
chu[belong[a[i].x]]++;
ru[belong[a[i].y]]++;
}
}
if(cnt==1){printf("%d\n",n);return 0;}
int ans,zs=0;
for(int i=1;i<=cnt;i++){
if(chu[i]==0){
zs++;ans=i;
}
}
if(zs==1)printf("%d\n",num[ans]);
else printf("0\n");
}