Cow Contest POJ - 3660

时间:2023-03-09 03:12:57
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;
}