题目链接:https://www.luogu.com.cn/problem/P2419
思路:floyd
floyd的核心思想是通过枚举中间点来确定两点之间的最短距离。对于这道题来说通过枚举中间的牛来确定这两只牛是否有关系。
f[x][y]表示x赢了y,也表示x和y连通。要想知道一个牛的排名是否确定,就需要看其他牛是否和这个点连通。比如说有n头牛,对于剩下n-1头牛中,他们都要与这头牛有关系,可能是这头牛输,也可能是这头牛赢
只有这n-1头牛都和这只牛有关系了,我们才能知道这头牛的排名。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=110;
int n,m;
int arr[maxn][maxn];
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int t1,t2;
cin>>t1>>t2;
arr[t1][t2]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
arr[j][k]=arr[j][k] || arr[j][i]&&arr[i][k];
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
int flag=1;
for(int j=1;j<=n;j++){
if(i==j)continue;
flag=flag&&(arr[i][j]|| arr[j][i]);
}
ans+=flag;
}
cout<<ans;
return 0;
}