[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 }