POJ-3660 Cow Contest(Floyd-Warshall)

描述

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);
}

猜你喜欢

转载自blog.csdn.net/weixin_53623850/article/details/116657456
今日推荐