• 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;
    }
    

      

    每日水题,身体棒棒!



  • 相关阅读:
    NHibernate 中in的使用方法,以及使用sql表达式
    C#调用存储过程,并且获得返回值和OutPut字符串
    NHibernate 中delete的使用方法
    SQL中Case when 方法的使用
    NHibernate 根据Model ID获取对象
    C# Excel导出数据和Excel导入数据帮助类
    查询五个月前到现在的数据
    NHibernate 中Between的使用方法
    jquery操作滚动条滚动到指定位置
    将DataReader转换为DataTable
  • 原文地址:https://www.cnblogs.com/stxy-ferryman/p/7466783.html
Copyright © 2020-2023  润新知