GDUT 2020寒假训练 图论 A
原题链接
题目大意
n头牛两两比赛,已知m条比赛胜负关系,如果A战胜了B,那么A的等级比B高,如果A比B高,C比A高则可以确定C也比B的等级高,给出这m条比赛关系,求可以确定等级的牛的个数
思路
floyd遍历
先读入每一次的战胜关系,然后根据已有条件补出全部的关系,比如已知A比B高,B比C高,那么即使没有给出A比C高,我们也可以通过floyd补出A比C高。将所有的关系补全后,再次遍历这个邻接矩阵,若当前这个人无论是他比别人高,还是别人比他高,凡是能确认的关系等于n-1条,即说明这个人在全局的排名已经确定(因为已经有了跟n-1个人也就是所有人的胜负记录)。
代码
#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
bool mp[200][200];
int main()
{
memset(mp,false,sizeof mp);
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
mp[x][y]=true;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(mp[i][k]&&mp[k][j])
{
mp[i][j]=true;
}
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
int cnt=0;
for(int j=1;j<=n;j++)
{
if(mp[i][j]||mp[j][i])//i战胜j或j战胜i
{
cnt++;
}
}
if(cnt==n-1)
{
ans++;
}
}
cout<<ans<<endl;
return 0;
}