題目連結: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 }