zoukankan      html  css  js  c++  java
  • hdu 2094 产生冠军(拓扑排序)

    产生冠军

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 11417    Accepted Submission(s): 5286


    Problem Description
    有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。
    球赛的规则例如以下:
    假设A打败了B,B又打败了C。而A与C之间没有进行过比赛,那么就认定,A一定能打败C。


    假设A打败了B,B又打败了C。并且,C又打败了A,那么A、B、C三者都不可能成为冠军。
    依据这个规则,无需循环较量,也许就能确定冠军。

    你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。

     

    Input
    输入含有一些选手群,每群选手都以一个整数n(n<1000)开头,后跟n对选手的比赛结果,比赛结果以一对选手名字(中间隔一空格)表示,前者战胜后者。

    假设n为0,则表示输入结束。


     

    Output
    对于每一个选手群,若你推断出产生了冠军,则在一行中输出“Yes”,否则在一行中输出“No”。


     

    Sample Input
    3 Alice Bob Smith John Alice Smith 5 a c c d d e b e a d 0
     

    Sample Output
    Yes No
     

    Author
    qianneng
     

    Source
     

    Recommend
    lcy
     

    Statistic | Submit | Discuss | Note

    对于这道题 第一次我用的拓扑排序  但是。。

    写着写着不知道怎样写下去了。

    当sum>0的时候是信息冲突。出现两个入度同一时候为0的是信息不完整(对于推断整个排名,不不过冠军)

    但是这道题推断的仅仅是冠军。不知道从何下手了。。

    到最后还是百度了。

    但是我看别人做的也是有错误的。。却能AC..可能是题目叙述不清的缘故把。对于网上的,假设1 2,2 3,4 5,5 6,6 4后者都成环了。。

    还能推断冠军。

    就这吧。。

    我也不知道咋办了

    AC:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <set>
    using namespace std;
    int main()
    {
        set<string>s1;
        set<string>s2;
        int n;
        while(~scanf("%d",&n))
        {
            if(n==0)
            break;
            char str1[50],str2[50];
            while(n--)
            {
                scanf("%s %s",str1,str2);
                s1.insert(str1);
                s1.insert(str2);
                s2.insert(str2);
                memset(str1,0,sizeof(str1));
                memset(str2,0,sizeof(str2));
            }
            if(s1.size()-s2.size()==1)
            printf("Yes
    ");
            else
            printf("No
    ");
            s1.clear();
            s2.clear();
        }
        return 0;
    }
    

    我的拓扑排序:不会了0.0是wa的:

    #include <stdio.h>
    #include <string.h>
    #include <vector>
    #include <queue>
    using namespace std;
    int vis[1005][1005],in[1005],k,sum;
    vector<int>map[1005];
    void top_sort()
    {
    	queue<int>s;
    	for(int i=0;i<k;i++)
    	if(in[i]==0)
    	s.push(i);
    	while(!s.empty())
    	{
    		if(s.size()>1)
    		break;
    		int pos=s.front();
    		s.pop();
    		sum--;
    		for(int i=0;i<map[pos].size();i++)
    		{
    			in[map[pos][i]]--;
    			if(in[map[pos][i]]==0)
    			s.push(map[pos][i]);
    		}
    	}
    	if(sum>0||!s.empty())//不会了0.0
    	{
    		printf("No
    ");
    		while(!s.empty())
    		s.pop();
    	}
    	else
    	printf("Yes
    ");
    }
    int main()
    {
    	int n;
    	char str[1005][50];
    	while(scanf("%d",&n)&&n)
    	{
    		memset(str,0,sizeof(str));
    		memset(vis,0,sizeof(vis));
    		memset(map,0,sizeof(map));
    		memset(in,0,sizeof(in));
    		k=0;
    		for(int i=0;i<n;i++)
    		{
    			int a=-1,b=-1;
    			char str1[50],str2[50];
    			memset(str1,0,sizeof(str1));
    			memset(str2,0,sizeof(str2));
    			scanf("%s %s",str1,str2);
    			for(int j=0;j<k;j++)
    			{
    				if(strcmp(str1,str[j])==0)
    				a=j;
    				if(strcmp(str2,str[j])==0)
    				b=j;
    			}
    			if(a==-1)
    			strcpy(str[k++],str1),a=k-1;
    			if(b==-1)
    			strcpy(str[k++],str2),b=k-1;
    			if(!vis[a][b])
    			vis[a][b]=1,map[a].push_back(b),in[b]++;
    		}
    		sum=k;
    		top_sort();
    	}
    	return 0;
    }


  • 相关阅读:
    Sql server时间转时间long
    SQL Server死锁问题:事务(进程 ID x)与另一个进程被死锁在 锁 | 通信缓冲区资源上并且已被选作死锁牺牲品。请重新运行该事务。
    layui jquery ajax,url,type,async,dataType,data
    在 Postman 中报错:Self-signed SSL certificates are being blocked 的分析与解决
    SQL server CASE WHEN
    SQL server 统计分组经计
    Spring boot @Transactional
    基于mysql的sakila数据库脚本分析
    常用数据库JDBC
    在做银行支付接口案例的时候,遇到的编码问题!
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6867072.html
Copyright © 2011-2022 走看看