zoukankan      html  css  js  c++  java
  • 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 ;
    }


  • 相关阅读:
    ORACLE错误笔记
    SQL-考试各科目的成绩以及各科目的参与考试次数
    MySql有几条更新sql不能执行时的解决方案
    面试中常遇到的算法面试题
    MySql绿色版安装教程
    Javaweb
    关于JavaWeb不使用框架上传文件的简单实现
    SSM框架
    数据库
    J2SE
  • 原文地址:https://www.cnblogs.com/int32bit/p/3187797.html
Copyright © 2011-2022 走看看