cugb 1241谁赢了?

谁赢了?

Time Limit:3000MS  Memory Limit:65536K
Total Submit:328 Accepted:76

Description

CUGB的ACM集训队队员都热爱体育运动,于是乎在训练之余,ZCrazy决定组织一次 队内乒乓球比赛,集训队一共有N个人,决定比赛M场,两个队友之间最多只能比一场。ZCrazy在比赛期间会问“A和B谁赢了?”但是有时候你是回答不出他这样的问题的。 
例如:在三个队友A,B,C之间只比了一场,A赢B,当ZCrazy问你A和B谁赢了?你会回答A赢了,但是如果他问你B和C谁赢了,你就无法回答他了。 
这里假设每个队员能力值是一定的,不会出现A赢B,B赢C,C赢A的情况。即能力值大的队员不会输给能力值低的队员。 
有时候Zcrazy会把所有可能的问题都问了一遍,故意刁难你。你作为ZCrazy的助手,你想知道,你最多会有多少道题回答不上来(A和B谁赢了,B和A谁赢了是同一道题,ZCrazy不会问相同的问题)。

Input

输入包含多种情况,第一行输入一个正整数代表有多少种情况。 
每个情况开头包含两个正整数,N和M(N,M<=500),N代表CUGB队员的人数(1,2……N代表队员),M代表比赛的场数,接下来的M行,每行有两个正整数A和B,表示A和B比赛A获胜,定义如果A胜B并且B胜C那么A就胜 C。也不会出现A胜B,B胜C,C胜A这种情况。(即能力值一定)

Output

每种情况输出占一行,输出无法回答的最多问题的数目。

Sample Input

3
3 3
1 2
1 3
2 3
3 2
1 2
2 3
4 2
1 2
3 4

Sample Output

0
0
4

Source

ZCrazy

刚开始。我觉得相当容易的水题。不就是求传递闭包吗?简单啊。。直接用floyd。。。

我是这样的A->B就是说明A打败B,那也是说明B输给了A嘛!所以简图时,若有A->B,则map[a][b]=map[b][a];

然后直接用floyd算法。。测试了下数据完全没有错!!哈哈。。提交。。WA了。。什么原因。。。?

看算法确实没有错吧?。。。。。无助中。。。

突然秋风举了个反例A->B,A->C 如果按照刚才的说法。。可以推出B->C..。。。这样明显错了。。。怎么这都没有想到了呢?

马上改代码。。设置第三状态。。如果A-B 则赋值map[a][b]=1,代表A打败B,并且map[b]][a]=2,代表b输给a。。所以AC了。。


核心代码

void floyd(int n)
{
	int i,j,k;
	for(k=1;k<=n;k++)
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				if(a[i][j]==0&&a[i][k]==1&&a[k][j]==1)
				{
					a[i][j]=1;
					a[j][i]=2;
				}
	return ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值