每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这
种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头
牛被所有的牛认为是受欢迎的。
一个数,即有多少头牛被所有的牛认为是受欢迎的。
易证如果一头牛受所有牛欢迎,那么它所在的强连通分量中所有的牛都受欢迎,且不在其所在的强连通分量中的牛没有一头受所有牛欢迎。
数据范围这么小所以就tarjan乱搞搞就出来了啊 - -
#include "iostream" #include "memory.h" #include "stdio.h" #include "vector" using namespace std; const int N=10005; int read(){ int v=0; char ch=getchar(); while (ch<'0'||ch>'9') ch=getchar(); while (ch<='9'&&ch>='0') { v=v*10+ch-'0'; ch=getchar();} return v; } int dfn[N],low[N],n,m,cnt; bool vis[N],stin[N],to[N]; int st[N],len,tmp,siz; vector <int> e[N]; bool dfs(int q){ to[q]=true; int i; ++cnt; for (i=0;i<e[q].size();i++){ if (!to[e[q][i]]){ dfs(e[q][i]); } } return cnt==n; } bool tarjan(int c){ st[++len]=c; int i; ++tmp; dfn[c]=low[c]=tmp; stin[c]=vis[c]=true; for (i=0;i<e[c].size();i++){ if (dfn[e[c][i]]==0){ if(tarjan(e[c][i])) return true; low[c]=min(low[c],low[e[c][i]]); } else if(stin[e[c][i]]){ low[c]=min(low[c],dfn[e[c][i]]); } } if (dfn[c]==low[c]){ siz=cnt=0; int v; memset(to,0,sizeof(to)); do { stin[st[len]]=false,v=st[len--],siz++; } while(c!=v); if (dfs(c)) return printf("%d\n",siz),true; } return false; } int main(){ n=read(); m=read(); int i,u,v; for (i=1;i<=m;i++) u=read(),v=read(),e[v].push_back(u); for (i=1;i<=n;i++) if (!dfn[i]) if(tarjan(i)) return 0; return puts("0"),0; }