hdu1285 拓扑序

题意:有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。 (中文题面就不讲了)

主这题需要按字典序最小来排序,所以用优先队列代替队列完成拓扑排序就行。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxm=505;
 7 
 8 int id[maxm],n,m;
 9 int ma[maxm][maxm];
10 
11 void topo(){
12     priority_queue<int,vector<int>,greater<int> >q;
13     for(int i=1;i<=n;i++){
14         if(!id[i])q.push(i);
15     }
16     int cnt=0;
17     while(!q.empty()){
18         int u=q.top();
19         printf("%d",u);
20         if(++cnt==n)printf("
");
21         else printf(" ");
22         q.pop();
23         for(int i=1;i<=n;++i){
24             if(i==u)continue;
25             if(ma[u][i]){
26                 id[i]--;
27                 if(!id[i])q.push(i);
28             }
29         }
30     }
31 }
32 
33 int main(){
34     while(scanf("%d%d",&n,&m)!=EOF){
35         memset(ma,0,sizeof(ma));
36         while(m--){
37             int a,b;
38             scanf("%d%d",&a,&b);
39             if(!ma[a][b]){
40                 ma[a][b]=1;
41                 id[b]++;
42             }
43         }
44         topo();
45     }
46     return 0;
47 }
View Code
原文地址:https://www.cnblogs.com/cenariusxz/p/4794883.html