
链接:https://vjudge.net/problem/POJ-3660
思路:首先一个牛如果排名确定,那么打败它的牛+他打败的牛 = n-1,其次如果a打败b,b打败c,可以确定a打败c,综上我们需要求整个图传递闭包,然后统计每个点的度,度数 = n-1的点就是确定的点
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
#include<cstdio> #include<cstring>
int dp[110][110]; int point[110]; int n,m;
int main(){ memset(dp,0,sizeof(dp)); scanf("%d%d",&n,&m); for(int i=0;i<m;i++){ int a,b; scanf("%d%d",&a,&b); a--; b--; dp[a][b] = 1; } for(int k=0;k<n;k++){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ dp[i][j] = dp[i][j]||(dp[i][k]&&dp[k][j]);//传递闭包 } } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(dp[i][j]||dp[j][i]){ point[i]++; } } } int res = 0; for(int i=0;i<n;i++)if(point[i]==n-1)res++; printf("%dn",res); return 0; }
|
近期评论