杭電 1285 確定比賽名次(拓撲排序)
阿新 • • 發佈:2018-04-01
hdu -h 整數 click tro hit pro set 接下來
Problem Description 有N個比賽隊(1<=N<=500),編號依次為1,2,3,。。
Output 給出一個符合要求的排名。
Sample Output 1 2 4 3 拓撲排序模板題: ?AC代碼:
http://acm.hdu.edu.cn/showproblem.php?pid=1285
確定比賽名次
Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11664????Accepted Submission(s): 4644Problem Description 有N個比賽隊(1<=N<=500),編號依次為1,2,3,。。
。
。,N進行比賽,比賽結束後,裁判委員會要將全部參賽隊伍從前往後依次排名,但如今裁判委員會不能直接獲得每一個隊的比賽成績。僅僅知道每場比賽的結果,即P1贏P2。用P1。P2表示,排名時P1在P2之前。如今請你編程序確定排名。
Output 給出一個符合要求的排名。
輸出時隊伍號之間有空格。最後一名後面沒有空格。
其它說明:符合條件的排名可能不是唯一的,此時要求輸出時編號小的隊伍在前;輸入數據保證是正確的。即輸入數據確保一定能有一個符合要求的排名。
Sample Output 1 2 4 3 拓撲排序模板題: ?AC代碼:
#include<stdio.h> #include<iostream> using namespace std; int map[505][505],pre[505]; int c[505]; int n,m; void topsort() { int i,j,k,p=1; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(pre[j]==0) // 假設該頂點入度為0 { pre[j]--; //刪除該頂點,即該頂點入度減一 c[p++]=j; //刪除元素儲存到c[]數組中 for(k=1;k<=n;k++) { if(map[j][k]==1) //推斷該頂點j與哪些點相連 pre[k]--; //若相連。則刪除該邊,即把與頂點j相連那點的入度減一 } break; } } } } int main () { int a,b,i; while(~scanf("%d%d",&n,&m)) { memset(pre,0,sizeof(pre)); memset(map,0,sizeof(map)); for(i=0;i<m;i++) { scanf("%d%d",&a,&b); if(map[a][b]==0) // 要考慮重邊情況 { map[a][b]=1; pre[b]++; } } topsort(); for(i=1;i<=n;i++) { if(i!=n) printf("%d ",c[i]); else printf("%d\n",c[i]); } } return 0; }
杭電 1285 確定比賽名次(拓撲排序)