日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【HDU - 1285】确定比赛名次 (拓扑排序)

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【HDU - 1285】确定比赛名次 (拓扑排序) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題干:

有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

解題報告:

? ? 拓撲排序模板。用鄰接矩陣存圖,會超時。

?

?AC代碼:

#include<bits/stdc++.h>using namespace std; const int MAX = 500 + 5 ; struct Node {int to;int w;int ne; } e[MAX]; int in[MAX],head[MAX],ans[MAX]; int cnt = 0,top = 0; priority_queue<int,vector<int > ,greater<int> > pq; void init() {cnt = 0;top = 0;memset(in,0,sizeof(in));memset(head,-1,sizeof(head));while(!pq.empty() ) pq.pop(); } void add(int u,int v,int w) {e[cnt].to = v;e[cnt].w = w;e[cnt].ne = head[u];head[u] = cnt;cnt++; } int main() {int n,m;int u,v;while(~scanf("%d%d",&n,&m) ) {init();while(m--) {scanf("%d%d",&u,&v);add(u,v,0);in[v]++;}//預處理一下pq for(int i = 1; i<=n; i++) {if(in[i] == 0 ) pq.push(i);}while(!pq.empty() ) {int cur = pq.top();//養成習慣,bfs中也是,取出元素后都先給一個變量cur存著以免以后忘了pop,并且新的都用new表示 pq.pop();ans[++top] = cur;for(int i = head[cur]; i!=-1; i=e[i].ne) {in[e[i].to]--;if(in[e[i].to] == 0) pq.push(e[i].to);} }if(top != n ) printf("不成環\n");else {for(int i = 1; i<=top; i++) {printf("%d%c",ans[i],i==top?'\n':' ');}}}return 0 ; }

超時代碼:

#include<iostream> #include<cstdio> #include<cstring> using namespace std; //struct Edge { // int to; // int w; // int ne; // //} e[5000]; int maze[505][505]; int in[505]; void init() {memset(in,0,sizeof(in));memset(maze,0,sizeof(maze) ) ; } int main() {int n,m,u,v;int flag = 0;while(~scanf("%d%d",&n,&m) ) {init();while(m--) {scanf("%d%d",&u,&v);maze[u][v] = 1;in[v]++;}int cnt = 0 ;while(1) {if(cnt == n) break;flag = 0 ;for(int i = 1; i<=n; i++) {if(in[i] == 0) {in[i]--;if(cnt == n-1) {printf("%d\n",i);cnt++;}for(int j = 1; j<=n; j++) {if(maze[i][j] == 1) {flag = 1;in[j]--;maze[i][j] = 0;cnt++;printf("%d%c",i,cnt==n?'\n':' ');break;}}if(flag == 1) {break;}}}}}return 0 ;}

?

總結

以上是生活随笔為你收集整理的【HDU - 1285】确定比赛名次 (拓扑排序)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。