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
相关文章推荐
- [Mechine Learning & Algorithm] 神经网络基础
- Shell 脚本知识回顾 (四) —— Shell 命令及Shell 相关语句
- gc(),垃圾回收器,finalize()
- scala学习八:scala的actor
- Shell 脚本知识回顾 (五) —— Shell 循环
- 8-1-边界标识法-动态存储管理-第8章-《数据结构》课本源码-严蔚敏吴伟民版
- Quartz之Trigger
- Adapter
- C++——static关键字(全局变量,局部变量,函数)
- java基础-css
- Letter Combinations of a Phone Number
- CDM2.04.06 WHQL Certified
- 13-1盒模型代码简写关于颜色的css样式也是可以缩写的,当你设置的颜色是16进制的色彩值时,如果每两位的值相同,可以缩写一半。 例子1: p{color:#000000;} 可以缩写为: p{
- Shell 脚本知识回顾 (六) —— Shell 函数
- [翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6
- 【设计模式】中介者模式
- 解决数组输出汉字问题的分类
- 思捷 XEN的网络逻辑 与其 locking-mode理解
- js快速去除数组重复项
- Shell 脚本中如何使用make命令