zoukankan      html  css  js  c++  java
  • [BZOJ] 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛

    1612: [Usaco2008 Jan]Cow Contest奶牛的比赛

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 1186  Solved: 804
    [Submit][Status][Discuss]

    Description

    FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:)。在赛场上,奶牛们按1..N依次编号。每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平不相上下,也就是说,奶牛们的编程能力有明确的排名。 整个比赛被分成了若干轮,每一轮是两头指定编号的奶牛的对决。如果编号为A的奶牛的编程能力强于编号为B的奶牛(1 <= A <= N; 1 <= B <= N; A != B) ,那么她们的对决中,编号为A的奶牛总是能胜出。 FJ想知道奶牛们编程能力的具体排名,于是他找来了奶牛们所有 M(1 <= M <= 4,500)轮比赛的结果,希望你能根据这些信息,推断出尽可能多的奶牛的编程能力排名。比赛结果保证不会自相矛盾。

    Input

    * 第1行: 2个用空格隔开的整数:N 和 M

    * 第2..M+1行: 每行为2个用空格隔开的整数A、B,描述了参加某一轮比赛的奶 牛的编号,以及结果(编号为A,即为每行的第一个数的奶牛为 胜者)

    Output

    * 第1行: 输出1个整数,表示排名可以确定的奶牛的数目

    Sample Input

    5 5
    4 3
    4 2
    3 2
    1 2
    2 5

    Sample Output

    2

    输出说明:

    编号为2的奶牛输给了编号为1、3、4的奶牛,也就是说她的水平比这3头奶
    牛都差。而编号为5的奶牛又输在了她的手下,也就是说,她的水平比编号为5的
    奶牛强一些。于是,编号为2的奶牛的排名必然为第4,编号为5的奶牛的水平必
    然最差。其他3头奶牛的排名仍无法确定。

    HINT

     

    Source

     

    Analysis

    一个可爱的DAG(有向无环图)=w=

    将每场比赛的胜者和败者用一条有向边连起来,因为题目保证不会自相矛盾所以结果肯定是一个DAG

    那么对于一个特定的结点,该点之前的结点就是能力强于这头牛的点,之后的点依此类推嗯=w=

    那么如果一个点前面和后面的点有n-1个,这头牛的排名就确定了呀=w=

    Code

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #define maxn 1000000
     5 using namespace std;
     6 
     7 struct edge{
     8     int from,v;
     9 }e[maxn],e1[maxn];
    10 
    11 int n,m,ret;
    12 bool book[maxn];
    13 int czl[maxn][2],center;
    14 int tot,tot1,first[maxn],first1[maxn];
    15 void insert(int u,int v){
    16     tot++;
    17     e[tot].from = first[u];
    18     e[tot].v = v;
    19     first[u] = tot;
    20     
    21     tot1++;
    22     e1[tot1].from = first1[v];
    23     e1[tot1].v = u;
    24     first1[v] = tot1;
    25 }
    26 
    27 void dfs(int p){
    28     for(int i = first[p];i;i = e[i].from){
    29         int v = e[i].v;
    30         if(!book[v]){
    31             czl[center][0]++;
    32             book[v] = true;
    33             dfs(v);
    34         }
    35     }
    36 }
    37 
    38 void dfs1(int p){
    39     for(int i = first1[p];i;i = e1[i].from){
    40         int v = e1[i].v;
    41         if(!book[v]){
    42             czl[center][1]++;
    43             book[v] = true;
    44             dfs1(v);
    45         }
    46     }
    47 }
    48 
    49 int main(){
    50     scanf("%d%d",&n,&m);
    51     
    52     for(int i = 1;i <= m;i++){
    53         int a,b;
    54         scanf("%d%d",&a,&b);
    55         insert(a,b);
    56     }
    57     
    58     for(int i = 1;i <= n;i++){
    59         memset(book,false,sizeof(book));
    60         book[i] = true;
    61         center = i;
    62         dfs(i);
    63         dfs1(i);
    64         if(czl[i][0]+czl[i][1] == n-1) ret++;
    65     }
    66     
    67     printf("%d",ret);
    68     
    69     return 0;
    70 }
    =w=
    转载请注明出处 -- 如有意见欢迎评论
  • 相关阅读:
    左偏树
    论在Windows下远程连接Ubuntu
    ZOJ 3711 Give Me Your Hand
    SGU 495. Kids and Prizes
    POJ 2151 Check the difficulty of problems
    CodeForces 148D. Bag of mice
    HDU 3631 Shortest Path
    HDU 1869 六度分离
    HDU 2544 最短路
    HDU 3584 Cube
  • 原文地址:https://www.cnblogs.com/Chorolop/p/7462828.html
Copyright © 2011-2022 走看看