BZOJ 1612 [Usaco2008 Jan]Cow Contest奶牛的比赛:floyd传递闭包
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1612
题意:
有n头牛比赛。
告诉你m组(a,b),表示牛a成绩比牛b高。
保证排名没有并列。
问你有多少只牛的排名已经确定。
题解:
对于一头牛,它的排名确定的条件是:它前面的牛数量 + 它后面的牛数量 = n-1
所以对于(a,b),连一条有向边a->b。
然后做floyd传递闭包。
枚举每一头牛,统计与它连通的牛的个数sum。
如果sum = n-1,则ans++。
AC Code:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #define MAX_N 105 5 6 using namespace std; 7 8 int n,m; 9 int ans=0; 10 bool dis[MAX_N][MAX_N]; 11 12 int main() 13 { 14 cin>>n>>m; 15 memset(dis,false,sizeof(dis)); 16 int a,b; 17 for(int i=0;i<m;i++) 18 { 19 cin>>a>>b; 20 dis[a][b]=true; 21 } 22 for(int k=1;k<=n;k++) 23 { 24 for(int i=1;i<=n;i++) 25 { 26 for(int j=1;j<=n;j++) 27 { 28 if(i!=j && j!=k && i!=k) 29 { 30 dis[i][j]|=(dis[i][k]&dis[k][j]); 31 } 32 } 33 } 34 } 35 for(int i=1;i<=n;i++) 36 { 37 int sum=0; 38 for(int j=1;j<=n;j++) 39 { 40 sum+=(dis[i][j]|dis[j][i]); 41 } 42 if(sum==n-1) ans++; 43 } 44 cout<<ans<<endl; 45 }