Cow Contest POJ - 3660

题意

有n(1<=n<=100)个学生参加编程比赛。
给出m条实力信息。(1<=M<=4500)
其中每一条的格式为 A B (1<=A<=N,1<=B<=N,A!=B) 意思是A的实力比B强。
如果A比B强且B比C强,那么A一定比C强。
问最后有多少名学生可以确定他的排名。
保证输入信息不存在矛盾


题解

n<=100!!!

若A强于B则A向B连一条单向边
直接强行floyed判断连通性,如果这个点能到达的点数和能到达它的点数和为n-1则说明它的排名是确定的


常数巨大的代码

# include <stdio.h>
# include <stdlib.h>
# include <iostream>
# include <string.h>
# define IL inline
# define RG register
# define mem(a, b) memset(a, b, sizeof(a))
# define Max(a, b) (((a) > (b)) ? (a) : (b))
# define Min(a, b) (((a) < (b)) ? (a) : (b))
using namespace std;

IL int Get(){
    RG char c = '!'; RG int x = 0, z = 1;
    for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
    for(; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0';
    return x * z;
}

const int MAXN = 101;
int n, m, flag, ans, vis[MAXN], map[MAXN][MAXN];

int main(){
    n = Get(); m = Get();
    for(RG int i = 1; i <= m; i++)
        map[Get()][Get()] = 1;
    for(RG int k = 1; k <= n; k++)
        for(RG int i = 1; i <= n; i++)
            for(RG int j = 1; j <= n; j++)
                map[i][j] |= (map[i][k] & map[k][j]);
    for(RG int i = 1; i <= n; i++)
        for(RG int j = 1; j <= n; j++)
            vis[j] += map[i][j], vis[i] += map[i][j];
    for(RG int i = 1; i <= n; i++)
        ans += (vis[i] == n - 1);
    printf("%d\n", ans);
    return 0;
}
posted @ 2017-07-27 20:11  Cyhlnj  阅读(188)  评论(0)    收藏  举报