POJ 3660 Cow Contest floyd传递闭包
http://poj.org/problem?id=3660
题意:N头牛进行比赛,问有几头牛可以确定次序
读完题立马想到拓扑排序,写出来WA了N久,最后查的解题报告是传递闭包,某头牛前面和后面的牛加起来等于n-1时,则该牛的次序确定,这个思路还是lmy想出来的,就是搞数学的啊,理性思维
代码:
#include<iostream> #include<cstdio> #include<cstring> #define nMAX 102 using namespace std; int map[nMAX][nMAX],in[nMAX],out[nMAX]; int n; void floyd() { int i,j,k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(map[i][j])continue; if(map[i][k]&&map[k][j]) { map[i][j]=1; out[i]++;//出度 in[j]++;//入度 } } } int main() { int m,i,j; while(~scanf("%d%d",&n,&m)) { memset(map,0,sizeof(map)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); while(m--) { scanf("%d%d",&i,&j); map[i][j]=1; out[i]++; in[j]++; } floyd(); int ans=0; for(i=1;i<=n;i++) if(in[i]+out[i]==n-1)ans++; printf("%d\n",ans); } return 0; }