题意:有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。 (中文题面就不讲了)
主这题需要按字典序最小来排序,所以用优先队列代替队列完成拓扑排序就行。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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("\n");
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 }