一、算法分析
floyd算法可以将两个点之间的“到达”关系进行拓展。本题可以将两个奶牛间的确定的比较关系视作一种“到达”关系。然后再进行拓展。当一个点可以“到达”所有其它点的时候,就说明这个奶牛是与其它奶牛可比的,也就是说其是可以确定名次的。
二、代码与注释
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#define ll long long
using namespace std;
const int maxn=105;
int n,m;
int f[maxn][maxn];
int main(){
cin>>n>>m;
int x,y;
for(int i=1;i<=n;i++) f[i][i]=1;//自己可以到自己
for(int i=0;i<m;i++){
cin>>x>>y;
f[x][y]=1; //表示从x可以“到”y
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(!f[i][j]){
if(f[i][k] && f[k][j]) f[i][j]=1;
} //将“到达”关系进行传递
}
int sum=0;
for(int i=1;i<=n;i++){
int ok=1;
for(int j=1;j<=n;j++){
if(!f[i][j] && !f[j][i]){ //不可“到达”所有点,则不合题意,注意这里是双向的
ok=0;
break;
}
}
if(ok) sum++;
}
cout<<sum;
return 0;
}