http://poj.org/problem?id=3660
题意:农场主想看看在自己的牛之中哪头牛比较厉害,所以就让他们彼此间进行打架了。(大黑牛:咱们来干一架吧) 若 A KO B, B KO C, 那么 A 一定能 KO C。 给你几场比赛下来后的结果, 让你确定有几头牛的排位可以确定。
分析:若 A总共 KO其他牛的次数 加上被 其他牛 KO 的次数为 N -1, 那么名次一定能够确定 <传递闭包>这个名词第一次在我的人生中出现了 (%>_<%)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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 ", ans); return 0; }