每日打卡(1/1)(补)
传送门:点击打开链接
题目大意:
共有n头奶牛,奶牛两两间比赛,问经过m轮比赛后,有多少奶牛可以确定名次。
思路:
假设一个奶牛比x头奶牛厉害,比y头奶牛弱,那么如果x+y=n-1,则能确定它的名次。因此,我们用Floyd来传递闭包。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int maxn = 205;
int n,m,map[maxn][maxn];
int ans = 0;
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(map[i][k]&&map[k][j])//如果两头奶牛能够间接地确定名次
map[i][j] = 1;
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(map,0,sizeof(map));
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d%d", &a,&b);
map[a][b] = 1;
}
floyd();
for(int i=1;i<=n;i++)
{
int tot=0;
for(int j=1;j<=n;j++)
{
if(map[i][j]||map[j][i])
tot++;
}
if(tot==n-1)
ans++;
}
cout<<ans<<endl;
return 0;
}