描述
http://www.lydsy.com/JudgeOnline/problem.php?id=1612
\(n\)头奶牛比赛,给出一些胜负情况,问可以确定多少头奶牛的排名.
分析
无论胜负,只要知道某一头奶牛和其他\(n-1\)头的关系就好了.
我们用dfs来求每一个奶牛赢了多少次,同时统计那些输了的.
#include <bits/stdc++.h>
using namespace std; const int maxn=+;
int n,m,ect,ans;
int win[maxn],los[maxn],head[maxn];
bool vis[maxn];
struct edge{
int to,next;
edge(int to=,int next=):to(to),next(next){}
}g[maxn*maxn];
inline int read(int &x){ x=;int k=;char c;for(c=getchar();c<''||c>'';c=getchar())if(c=='-')k=-;for(;c>=''&&c<='';c=getchar())x=x*+c-'';return x*=k; }
inline void add_edge(int u,int v){ g[++ect]=edge(v,head[u]); head[u]=ect; }
int dfs(int x){
los[x]++; vis[x]=true;
int s=;
for(int i=head[x];i;i=g[i].next)if(!vis[g[i].to]) s+=dfs(g[i].to);
return s;
}
int main(){
read(n); read(m);
for(int i=,u,v;i<=m;i++){
read(u); read(v);
add_edge(u,v);
}
for(int i=;i<=n;i++){
memset(vis,false,sizeof vis);
los[i]--;
win[i]=dfs(i)-;
}
for(int i=;i<=n;i++)if(win[i]+los[i]==n-) ans++;
printf("%d\n",ans);
return ;
}