程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hduoj1285確定比賽名次

hduoj1285確定比賽名次

編輯:C++入門知識

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
#include
#include
#include
#include
#include
using namespace std;
int main()
{
	vector< set >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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved