usaco 奶牛比赛
FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:)。在赛场上,奶牛们按1..N依次编号。每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平不相上下,也就是说,奶牛们的编程能力有明确的排名。 整个比赛被分成了若干轮,每一轮是两头指定编号的奶牛的对决。如果编号为A的奶牛的编程能力强于编号为B的奶牛(1 <= A <= N; 1 <= B <= N; A != B) ,那么她们的对决中,编号为A的奶牛总是能胜出。 FJ想知道奶牛们编程能力的具体排名,于是他找来了奶牛们所有 M(1 <= M <= 4,500)轮比赛的结果,希望你能根据这些信息,推断出尽可能多的奶牛的编程能力排名。比赛结果保证不会自相矛盾。
————————————————————————————
很有意思的一个题!
何为排名确定?就是说比他水平高的和比他水平低的刚好和为n-1。
所以,正反建立两个图,分别看某一定能够搜索到的点的个数,如果和为n-1则名词确定,否则不确定!
————————————————————————————
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxm=4510; 4 const int maxn=105; 5 struct edge 6 { 7 int u,v,nxt; 8 }e[maxm<<1]; 9 int head[maxn<<1],js; 10 void addage(int u,int v) 11 { 12 e[++js].u=u;e[js].v=v; 13 e[js].nxt=head[u];head[u]=js; 14 } 15 int tj[maxn<<1]; 16 bool bz[maxn<<1]; 17 int n,m,ans; 18 int cnt; 19 void dfs(int u) 20 { 21 if(bz[u]==0) 22 { 23 bz[u]=1; 24 cnt++; 25 } 26 for(int i=head[u];i;i=e[i].nxt) 27 { 28 int v=e[i].v; 29 if(bz[v]==0)dfs(v); 30 } 31 } 32 int main() 33 { 34 scanf("%d%d",&n,&m); 35 for(int u,v,i=1;i<=m;++i) 36 { 37 scanf("%d%d",&u,&v); 38 addage(u,v); 39 addage(v+100,u+100); 40 } 41 for(int i=1;i<=n;++i) 42 { 43 memset(bz,0,sizeof bz);cnt=0; 44 dfs(i);tj[i]=cnt; 45 cnt=0; 46 dfs(i+100);tj[i+100]=cnt; 47 } 48 for(int i=1;i<=n;++i)if(tj[i]+tj[i+100]==n+1)ans++; 49 cout<<ans<<endl; 50 return 0; 51 }