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

      

    每日水题,身体棒棒!



  • 相关阅读:
    浅谈SQLite——查询处理及优化
    .NET 并行(多核)编程系列之七 共享数据问题和解决概述
    sql 存储过程学习一
    SQL中获得EXEC后面的sql语句或者存储过程的返回值的方法 【收藏】
    script刷新页面,刷新代码
    C#编程中关于数据缓存的经验总结
    SQL存储过程的概念,优点及语法
    SQLite数据库安装、试用及编程测试手记
    c# sqlite 数据库加密
    进销存管理系统的设计与实现
  • 原文地址:https://www.cnblogs.com/stxy-ferryman/p/7466783.html
Copyright © 2011-2022 走看看