【POJ】3660 Cow Contest
题目链接:http://poj.org/problem?id=3660
题意:n头牛比赛,有m场比赛,两两比赛,前面的就是赢家。问你能确认几头牛的名次。
题解:首先介绍个东西,传递闭包,它可以确定尽可能多的元素之间的关系。
然后回到这道题,怎么能确认这头牛的名次,也就是不管它胜还是败都能推导出其他n-1头牛跟它的关系。具体思想看代码。QWQ
代码:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 const int maxn = 110; 8 const int inf = 1e9; 9 int n,m; 10 int mp[maxn][maxn]; 11 12 void floyd(){ 13 for(int k = 1; k <= n ; k++){ 14 for(int i = 1; i <= n ;i++){ 15 for(int j = 1; j <= n ;j++){ 16 if(mp[i][j] == 1 || (mp[i][k] == 1 && mp[k][j] == 1) ){ 17 mp[i][j] = 1; 18 } 19 } 20 } 21 } 22 23 } 24 25 int main(){ 26 cin>>n>>m; 27 for( int i = 1; i <= m ;i++){ 28 int x,y; 29 cin>>x>>y; 30 mp[x][y] = 1; 31 } 32 floyd(); 33 int ans = 0; 34 for(int i = 1; i <= n ;i++){ 35 int cnt = 0; 36 for(int j = 1; j <= n; j++){ 37 if(i == j) 38 continue; 39 if(mp[i][j] == 1 || mp[j][i] == 1){ 40 cnt++; 41 } 42 } 43 if(cnt == n-1) 44 ans++; 45 } 46 cout<<ans<<endl; 47 return 0; 48 }