zoukankan      html  css  js  c++  java
  • hduoj1285确定比赛名次

    

    确定比赛名次

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 11940    Accepted Submission(s): 4756


    Problem Description
    有N个比赛队(1<=N<=500),编号依次为1,2,3。。。。。

    ,N进行比赛。比赛结束后,裁判委员会要将全部參赛队伍从前往后依次排名,但如今裁判委员会不能直接获得每一个队的比赛成绩。仅仅知道每场比赛的结果,即P1赢P2,用P1,P2表示。排名时P1在P2之前。如今请你编程序确定排名。

     

    Input
    输入有若干组。每组中的第一行为二个数N(1<=N<=500),M;当中N表示队伍的个数,M表示接着有M行的输入数据。

    接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。


     

    Output
    给出一个符合要求的排名。输出时队伍号之间有空格。最后一名后面没有空格。



    其它说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的。即输入数据确保一定能有一个符合要求的排名。


     

    Sample Input
    4 3 1 2 2 3 4 3
     

    Sample Output
    1 2 4 3
    算法:拓扑排序。
    心得:因为不会优先队列,所以就用set取代了。这条代码算是深深复习STL了
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<vector>
    #include<set>
    #include<stdio.h>
    using namespace std;
    int main()
    {
    	vector< set<int> >s(1100);
    	int n,m,i,j,k,t,num1,num2,a[1100],b[1100];
    	while(scanf("%d%d",&n,&m)!=EOF)
    	{
    	    memset(a,0,sizeof(a));
    		for(i=1;i<=m;i++)
    		{
    			scanf("%d%d",&num1,&num2);
    			if(num1==num2) continue;
    			s[num2].insert(num1);
    		}
    		k=0;
    		while(1)
            {
                for(i=1;i<=n;i++)
                {
                    if(s[i].empty()&&a[i]==0)
                    {
                        b[k++]=i;
                        a[i]=1;//标记数组
                        t=1;//标记是否取出元素
                    }
                    if(t==1)
                    {
                        for(j=1;j<=n;j++)
                        {
                            if(a[j]==0&&s[j].count(i))
                            {
                                s[j].erase(s[j].find(i));
                            }
                        }
                        t=0;
                        i=0;//有删除元素。所以i要从头開始。
                    }
                }
                if(k==n) break;
            }
            for(i=0;i<k-1;i++)
                    printf("%d ",b[i]);
                printf("%d
    ",b[i]);
    	}
    }
    

  • 相关阅读:
    如何快速上手LINQ to XML
    协变还是逆变,这还是个问题吗
    WPF的依赖属性是怎么节约内存的?
    CLR线程总结
    关于.NET异常 你应该知道的更多点
    [TED] Kinect控制的四翼直升机
    vSphere系列Windows环境安装部署嵌入式PSC的vCenter Server
    vSphere系列Linux环境部署安装非嵌入式PSC的vCenter Server Appliance
    Go 初识
    vSphere系列vCenter Server入门_01.认识与安装
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6816273.html
Copyright © 2011-2022 走看看