您的位置:首页 > 其它

BZOJ_1612_[Usaco2008_Jan]_Cow_Contest_奶牛的比赛_(dfs)

2016-06-19 21:39 405 查看

描述

http://www.lydsy.com/JudgeOnline/problem.php?id=1612

\(n\)头奶牛比赛,给出一些胜负情况,问可以确定多少头奶牛的排名.

 

分析

无论胜负,只要知道某一头奶牛和其他\(n-1\)头的关系就好了.

我们用dfs来求每一个奶牛赢了多少次,同时统计那些输了的.

 

 

#include <bits/stdc++.h>
using namespace std;

const int maxn=100+5;
int n,m,ect,ans;
int win[maxn],los[maxn],head[maxn];
bool vis[maxn];
struct edge{
int to,next;
edge(int to=0,int next=0):to(to),next(next){}
}g[maxn*maxn];
inline int read(int &x){ x=0;int k=1;char c;for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';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=1;
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=1,u,v;i<=m;i++){
read(u); read(v);
add_edge(u,v);
}
for(int i=1;i<=n;i++){
memset(vis,false,sizeof vis);
los[i]--;
win[i]=dfs(i)-1;
}
for(int i=1;i<=n;i++)if(win[i]+los[i]==n-1) ans++;
printf("%d\n",ans);
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: