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