http://poj.org/problem?id=3660

 

题意:农场主想看看在自己的牛之中哪头牛比较厉害,所以就让他们彼此间进行打架了。(大黑牛:咱们来干一架吧) 若 A KO B,  B KO C, 那么 A 一定能 KO C。 给你几场比赛下来后的结果, 让你确定有几头牛的排位可以确定。

 

分析:若 A总共 KO其他牛的次数 加上被 其他牛 KO 的次数为 N -1, 那么名次一定能够确定   <传递闭包>这个名词第一次在我的人生中出现了 (%>_<%)

 

 

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;

#define maxn 110
#define oo 0x3f3f3f3f
int maps[maxn][maxn];

int main()
{
    int n, m, a, b;

    scanf("%d %d", &n, &m);

    memset(maps, 0, sizeof(maps));

    for(int i=1; i<=m; i++)
    {
        scanf("%d %d", &a, &b);
        maps[a][b] = 1;
    }

    for(int k=1; k<=n; k++)
    {
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                if(maps[i][k] && maps[k][j])//若A赢B,B赢C,那么A赢C
                    maps[i][j] = 1;
            }
        }
    }

    int ans = 0;

    for(int i=1; i<=n; i++)
    {
        int k = 1;
        for(int j=1; j<=n; j++)
        {
            k += maps[i][j]+maps[j][i];//判断A被某某牛KO加上A KO某些牛总共的次数是否为N-1
        }
        if(k == n)
            ans ++;
    }

    printf("%d\n", ans);
    return 0;
}
View Code

 

posted on 2016-07-23 10:00  不忧尘世不忧心  阅读(135)  评论(0编辑  收藏  举报