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

    有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

    心路历程
    新开了拓扑排序的坑结果发现还是很简单的,读入的时候记录每个点的入度,然后不断找入度为0的点,将它扔到另一个数组里,减去它走向另外的点的边,即每个它所到达的点的入度-1。直到把所有的数都装进数组,然后输出这个数组。

    代码:
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define N 505
    using namespace std;
    int a[N][N],b[N],c[N],i,j,s,e,n,m;
    int main()
    {
    	while(scanf("%d%d",&n,&m)!=EOF)
    	{
    		memset(a,0,sizeof(a));
    		memset(b,0,sizeof(b));
    		memset(c,0,sizeof(c));
    	for(i=1;i<=m;i++)
    	{
    		scanf("%d%d",&s,&e);
    		if(!a[s][e])
    		{
    			a[s][e]=1;
    			b[e]++;
    		}
    	}
    	int num=0;
    	while(1)
    	{
    		j=0;
    		while(1)
    		{
    			j++;
    			if(b[j]==0)
    			{
    				break;
    			}
    			if(j>n)
    			{
    				break;
    			}
    		}
    		b[j]=-1;
    	    c[++num]=j;
    	    for(int k=1;k<=n;k++)
    	    {
    	    	if(a[j][k]>0)
    	    	{
    	    		b[k]--;
    	    		a[j][k]=-1;
    			}
    		}
    		if(num>n)
    		{
    			break;
    		}
        }
    	for(i=1;i<=n-1;i++)
    	{
    		printf("%d ",c[i]);
    	}
    	printf("%d
    ",c[n]);
    }
    return 0;
    }
    

      

    每日水题,身体棒棒!



  • 相关阅读:
    EL表达式格式化日期
    EL表达式格式化日期
    Jquery中find与each方法使用详解
    Jquery中find与each方法使用详解
    快递100接口使用
    快递100接口使用
    android 中context的具体作用和意义
    startactivityforresult使用
    android 获取sharedpreference的三种方法的区别
    关于contentprovider的几个问题
  • 原文地址:https://www.cnblogs.com/stxy-ferryman/p/7466783.html
Copyright © 2011-2022 走看看