奶牛比赛

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 }
View Code

 

posted on 2021-04-10 21:06  gryzy  阅读(91)  评论(0编辑  收藏  举报

导航