POJ 3660 Cow ContestCow(Floyd传递闭包)题解
题意:给出m个关系,问你能确定机头牛的排名
思路:要确定排名那必须要把他和其他n-1头牛比过才行,所以Floyd传递闭包,如果赢的+输的有n-1就能确定排名。
代码:
#include<cstdio> #include<set> #include<map> #include<cmath> #include<stack> #include<vector> #include<queue> #include<cstring> #include<string> #include<sstream> #include<iostream> #include<algorithm> #define ll long long using namespace std; const int maxn = 100+10; const int INF = 0x3f3f3f3f; int mp[maxn][maxn],can[maxn]; int main(){ int n,m; memset(mp,0,sizeof(mp)); memset(can,0,sizeof(can)); scanf("%d%d",&n,&m); while(m--){ int u,v; scanf("%d%d",&u,&v); mp[u][v] = 1; } for(int k = 1;k <= n;k++){ for(int i = 1;i <= n;i++){ for(int j = 1;j <= n;j++){ if(mp[i][k] && mp[k][j]){ mp[i][j] = 1; } } } } int ans = 0; for(int i = 1;i <= n;i++){ for(int j = 1;j <= n;j++){ if(mp[i][j] && i != j){ can[i]++; can[j]++; } } } for(int i = 1;i <= n;i++){ if(can[i] == n - 1) ans++; } printf("%d\n",ans); return 0; }