吉林省建设监理协会网站诚信建设,wordpress做在线编辑图片,房天下fangcom,建设银行陕西分行网站Description 每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛#xff0c;给你M对整数(A,B)#xff0c;表示牛A认为牛B受欢迎。 这种关系是具有传递性的#xff0c;如果A认为B受欢迎#xff0c;B认为C受欢迎#xff0c;那么牛A也认为牛C受欢迎。你的任务是求出有多少…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 HINT 100%的数据N10000,M50000 Source 缩点判断每个强连通分量的出度是否为0。若多个为0则不存在 代码 #includeiostream
#includecstdio
#includecstring
#define M 100010
using namespace std;
struct point{int next,to;
}e[M];
int n,m,cnt,num,tot,top,sz,ans;
int head[M],dfn[M],low[M],out[M],st[M],col[M],sum[M],a[M],b[M];
bool vis[M];
void add(int from,int to)
{e[num].nexthead[from];e[num].toto;head[from]num;
}
void tarjan(int x)
{dfn[x]low[x]cnt;st[top]x;vis[x]true;for(int ihead[x];i;ie[i].next){int toe[i].to;if(!dfn[to]){tarjan(to);low[x]min(low[x],low[to]);}else if(vis[to]) low[x]min(low[x],dfn[to]);}if(dfn[x]low[x]){tot;while(st[top1]!x){col[st[top]]tot;vis[st[top]]false;sum[tot];top--;}}
}
int main()
{scanf(%d%d,n,m);for(int i1;im;i){scanf(%d%d,a[i],b[i]);add(a[i],b[i]);}for(int i1;in;i)if(!dfn[i])tarjan(i);for(int i1;im;i)if(col[a[i]]!col[b[i]])out[col[a[i]]];for(int i1;itot;i)if(out[i]0) sz,anssum[i];if(sz1) printf(0);else printf(%d,ans);return 0;
} 转载于:https://www.cnblogs.com/Slrslr/p/9503039.html