• 奶牛比赛


    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
  • 相关阅读:
    24、合并两个有序链表
    23、反转链表
    22、删除链表的倒数第N个节点
    21、删除链表中的节点
    18、实现strStr()
    17、字符串转换整数 (atoi)
    15、有效的字母异位词
    16、验证回文字符串
    14、字符串中的第一个唯一字符
    mybatis入门(七)----延迟加载
  • 原文地址:https://www.cnblogs.com/gryzy/p/14642113.html
Copyright © 2020-2023  润新知