描述
N (1 ≤ N ≤ 100) 奶牛,方便编号 1…N,正在参加编程竞赛。众所周知,有些奶牛的编码比其他奶牛好。每头奶牛都有一定的恒定技能等级,这是竞争对手中独一无二的。
比赛分几轮进行,每轮在两头奶牛之间进行。如果牛A的技能水平高于牛B(1≤A≤N;1≤B≤N: A≠B),那么牛A将永远击败牛B。
农民约翰正试图按技能水平对奶牛进行排名。如果列出M(1≤M≤4500)双牛回合的结果,确定其排名可以从结果中精确确定的奶牛数量。 可以保证,回合的结果不会相互矛盾。
输入
第一行:两个空间分离整数:N和M*
M行:每行包含两个空间分离整数,描述单轮比赛的竞争对手和结果(第一整数,A,是赢家):A和B
输出
一个表示奶牛数量的单个整数,其排名可以确定
示例输入
5 5
4 3
4 2
3 2
1 2
2 5
样本输出
2
思路
用Floyd-Warshall
注意:排名确定是指前后排名都知道
用b[200]数组记录每头牛能打败的和被打败的牛个数
最后看看牛能打败的和被打败的牛个数是否等于n-1,是则排名确定
代码
#include "stdio.h"
int b[200],a[200][200];
int main()
{
int i,n,m,j,k=0,l,n1,n2;
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d %d",&n1,&n2);
a[n1][n2]=1;
b[n1]++;//记录牛n1出现的次数
b[n2]++;//记录牛n2出现的次数
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(k!=j&&k!=i&&i!=j)
{
//没有牛i打败牛j的记录,但是有牛i打败牛k,牛k打败牛j的记录,可以推出牛i能打败牛j
if(!a[i][j]&&a[i][k]&&a[k][j])
{
a[i][j]=1;//标记,防止重记录
b[i]++;//记录牛i出现的次数
b[j]++;//记录牛j出现的次数
}
}
}
k=0;
for(i=1;i<=n;i++)
if(b[i]==n-1)
k++;
printf("%d\n",k);
}