Cow Contest POJ

来源:互联网 发布:全国二手车评估软件 编辑:程序博客网 时间:2024/05/18 21:43

题意

有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;}