zoukankan      html  css  js  c++  java
  • HDU 1285:确定比赛名次(拓扑排序)

    确定比赛名次

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


    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 31 22 34 3
     

    Sample Output
    1 2 4 3

    思路:把给出的每组数据a,b按照<a,b>组成一个有向无环图,对这个图的顶点进行拓扑排序。

    将样例改成有向无环图


    然后找到入度为0的点:1,4 。因为要编号小的队伍在前,所以先删去点1和与1相关的边,并输出点1

    删去后如图:

    就这样一直按递增顺序删去入度为0的点并输出,直至最后无相连的点。

    最后可得到按顺序输出的点1-->2-->4-->3

    详解传送门

    AC代码

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <math.h>
    #include <limits.h>
    #include <map>
    #include <stack>
    #include <queue>
    #include <vector>
    #define ll long long
    #define INF 0x3f3f3f3f
    const int maxn=1e3+10;
    int p[maxn][maxn],vis[maxn];//p记录两点是否相连,vis记录点的入度
    int n,m;
    void toposort()
    {
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			if(!vis[j])//如果入度为0(没有前驱点)
    			{
    				vis[j]--;//入度变成-1进行标记(入度为-1的点均为已经删除的点)
    				printf("%d",j);//输出该节点
    				if(i!=n)
    					printf(" ");
    				else
    					printf("
    ");
    				for(int k=1;k<=n;k++)
    				{
    					if(p[j][k])
    						vis[k]--;//将与j相连的节点都删去(删除与j有关的边)
    				}
    				break;
    			}
    		}
    	}
    }
    int main(int argc, char const *argv[])
    {
    	int x,y;
    	while(~scanf("%d%d",&n,&m))//不要忘了是多组输入
    	{
    		memset(p,0,sizeof(p));
    		memset(vis,0,sizeof(vis));
    		for(int i=1;i<=m;i++)
    		{
    			scanf("%d%d",&x,&y);
    			//对数据进行处理,如果两点相连,p[x][y]=1,y的入度增加1
    			if(!p[x][y])
    			{
    				p[x][y]=1;
    				vis[y]++;
    			}
    		}
    		toposort();
    	}
    	return 0;
    }
  • 相关阅读:
    hibernate 继承映射关系( JOINED)
    hibernate 继承映射关系( TABLE_PER_CLASS)
    hibernate 继承映射关系( SINGLE_TABLE)
    hibernate list和iterate
    hibernate 1 + N 问题解决
    hibernate EJBQL QBC QBE
    Visual Studio 2015 Update 3 RC 候选预览版粗来了
    【Xamarin挖墙脚系列:Xamarin正式发布了IOS的模拟器在Windows下】
    Windows服务安装完成后自动启动
    用户IP地址的三个属性的区别(HTTP_X_FORWARDED_FOR,HTTP_VIA,REM_addr
  • 原文地址:https://www.cnblogs.com/Friends-A/p/9308990.html
Copyright © 2011-2022 走看看