链接:https://vjudge.net/problem/POJ-3660
思路:首先一个牛如果排名确定,那么打败它的牛+他打败的牛 = n-1,其次如果a打败b,b打败c,可以确定a打败c,综上我们需要求整个图传递闭包,然后统计每个点的度,度数 = n-1的点就是确定的点
代码:
#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("%d\n",res);
return 0;
}
网友评论