[hdu1285]确定比赛名次(拓扑排序)

题意:在一幅竞赛图中排序,要求同名次按字典序排序。

解题关键:拓扑排序模板题

1、邻接表建图

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<iostream>
 6 #include<cmath>
 7 #include<vector>
 8 #include<queue>
 9 using namespace std;
10 typedef long long ll;
11 const int N=510;
12 vector<int>g[N];
13 int deg[N],seq[N];
14 int n,m,u,v,tol;
15 priority_queue<int,vector<int>,greater<int> >q;//因为是按字典序的,要注意重边的情况
16 void toposort(){
17     for(int i=1;i<=n;i++)if(!deg[i])q.push(i);
18     tol=0;
19     while(q.size()){
20         int u=q.top();
21         q.pop();
22         seq[tol++]=u;
23         for(int i=0;i<g[u].size();i++){
24             int v=g[u][i];
25             deg[v]--;
26             if(!deg[v])q.push(v);
27         }
28     }
29 }
30 
31 int main(){
32     while(scanf("%d%d",&n,&m)!=EOF){
33         memset(deg,0,sizeof deg);
34         for(int i=1;i<=n;i++)g[i].clear();
35         for(int i=1;i<=m;i++){
36             scanf("%d%d",&u,&v);
37             g[u].push_back(v);
38             deg[v]++;
39         }
40         toposort();
41         for(int i=0;i<tol;i++)printf("%d%c",seq[i],i==tol-1?'\n':' ');
42     }
43     return 0;
44 }

 2、链式前向星建图

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<iostream>
 6 #include<cmath>
 7 #include<vector>
 8 #include<queue>
 9 using namespace std;
10 typedef long long ll;
11 const int N=510;
12 priority_queue<int,vector<int>,greater<int> >q;//因为是按字典序的,要注意重边的情况
13 int deg[N],seq[N];
14 int n,m,u,v,tol;
15 struct Edge{
16     int nxt;
17     int to;
18     int w;
19 }e[N];
20 int head[N],cnt;
21 void add_edge(int u,int v){
22     e[cnt].to=v;
23     e[cnt].nxt=head[u];
24     head[u]=cnt++;
25 }
26 void toposort(){
27     for(int i=1;i<=n;i++)if(!deg[i])q.push(i);
28     tol=0;
29     while(q.size()){
30         int u=q.top();
31         q.pop();
32         seq[tol++]=u;
33         for(int i=head[u];i!=-1;i=e[i].nxt){
34             int v=e[i].to;
35             deg[v]--;
36             if(!deg[v]) q.push(v);
37         }
38     }
39 }
40 
41 int main(){
42     while(scanf("%d%d",&n,&m)!=EOF){
43         memset(deg,0,sizeof deg);
44         memset(head, -1, sizeof head);
45         cnt=0;
46         for(int i=1;i<=m;i++){
47             scanf("%d%d",&u,&v);
48             add_edge(u,v);
49             deg[v]++;
50         }
51         toposort();
52         for(int i=0;i<tol;i++)printf("%d%c",seq[i],i==tol-1?'\n':' ');
53     }
54     return 0;
55 }

 

posted @ 2017-10-12 00:42  Elpsywk  阅读(225)  评论(0编辑  收藏  举报