Topological ordering is the linear ordering of the ADG (a direction-free graph)
Template:
Queue implementation
#include <cstdio>#include<cstring>#include<algorithm>#include<queue>using namespacestd;intindegree[ -];queue<int>Q;intn,m;BOOLmap[ -][ -];inta[ -];intTopointN) { intCNT =1; while(!q.empty ()) Q.pop (); for(inti =1; I <= N; i++) if(Indegree[i] = =0) Q.push (i); intu; while(!Q.empty ()) {u=Q.front (); A[cnt++] =u; Q.pop (); for(inti =1; I <= N; i++){ if(Map[u][i]) {Indegree[i]--; if(Indegree[i] = =0) Q.push (i); } } if(CNT = =N) { for(inti =1; I <= N; i++) printf ("%d", A[i]); } Elseprintf"The network has a cycle"); }}intMain () {intu,v; while(~SCANF ("%d%d",&n,&m)) {memset (Indegree,0,sizeof(Indegree)); memset (Map,0,sizeof(map)); for(inti =0; I < m; i++) {scanf ("%d%d",&u,&v); if(!Map[u][v]) Indegree[v]++; MAP[U][V]=1; } topo (n); } return 0;}View Code
adjacency Table Implementation
#include <cstdio>#include<cstring>#include<algorithm>#include<queue>using namespacestd;Const intM =100005;structedge{intv,nxt; Edge () {} Edge (intVintNXT): V (v), NXT (NXT) {}}e[m];inthead[m],e;intA[m];intIndegree[m];intn,m,u,v;voidAddedge () {e[e]=Edge (V, Head[u]); Head[u]= e++;}voidInti () {E=0; memset (Head,-1,sizeof(head)); Memset (A,0,sizeof(a)); memset (Indegree,0,sizeof(Indegree));}voidTopointN) {Queue<int>Q; intCNT =1; while(!q.empty ()) Q.pop (); for(inti =1; I <= N; i++) if(Indegree[i] = =0) Q.push (i); while(!Q.empty ()) { intU =Q.front (); A[cnt++] =u; Q.pop (); for(inti = Head[u]; ~u; i =e[i].nxt) {INDEGREE[E[I].V]--; if(INDEGREE[E[I].V] = =0) Q.push (E[I].V); } }}intMain () { while(~SCANF ("%d%d",&n,&m)) { for(inti =1; I <= m; i++) {scanf ("%d%d",&u,&v); INDEGREE[V]++; Addedge (); } topo (n); } return 0;} View Code
Topology Sort Template