算法竞赛模板 拓扑排序
①链式前向星版本:
#include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define maxSize 1005 int n,m,cn,head[maxSize],in[maxSize],rec[maxSize]; struct edge{ int to,next; }e[maxSize*maxSize]; void add(int x,int y) { e[++cn].next=head[x]; e[cn].to=y; head[x]=cn; } void TopSort() { int k=1,i; //priority_queue<int,vector<int>,greater<int> >st; stack<int>st; for(i=1;i<=n;i++) if(!in[i]) st.push(i); while(!st.empty()) { int u=st.top(); st.pop(); rec[k++]=u; for(i=head[u];i!=-1;i=e[i].next) { int x=e[i].to; in[x]--; if(!in[x]) st.push(x); } } } int main() { int i,x,y; while(scanf("%d%d",&n,&m)!=EOF) { memset(in,0,sizeof(in)); memset(head,-1,sizeof(head)); memset(rec,0,sizeof(rec)); cn=0; for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); add(x,y); in[y]++; } TopSort(); for(i=1;i<=n;i++) if(i==1)printf("%d",rec[i]); else printf(" %d",rec[i]); cout<<endl; } }
②vector邻接表版本:
#include<bits/stdc++.h> #define MAX 505 using namespace std; int in[MAX],n,m; vector<int>to[MAX]; void topsort() { queue<int>qu; int i,sum=0; for(i=1;i<=n;i++) if(in[i]==0) qu.push(i); while(!qu.empty()) { int a=qu.front(); qu.pop(); sum++; if(sum==1)cout<<a; else cout<<" "<<a; for(i=0;i<to[a].size();i++) { int v=to[a][i]; in[v]--; if(in[v]==0) qu.push(v); } } cout<<endl; } void init() { memset(in,0,sizeof(in)); for(int i=0;i<=MAX;i++) to[i].clear(); } int main() { ios::sync_with_stdio(false); int u,v,i; while(cin>>n>>m) { init(); for(i=1;i<=m;i++) { cin>>u>>v; to[u].push_back(v); in[v]++; } topsort(); } return 0; }