拓扑排序:
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。 通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
拓扑排序的实现方法:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
1 #include<stdio.h> 2 #include<memory.h> 3 4 int map[507][507]; 5 int in[507]; 6 int topsort[507]; 7 8 int n,m,i,j; 9 10 void tsort() 11 { 12 for(i=1;i<=n;i++) 13 { 14 int k =1; 15 while(in[k]!=0) k++; 16 in[k] = -1; 17 18 topsort[i] = k; 19 for(j=1;j<=n;j++) 20 { 21 if(map[k][j]==1){ 22 in[j]--; 23 } 24 } 25 } 26 } 27 int main(){ 28 while(scanf("%d%d",&n,&m)!=EOF) 29 { 30 int a,b; 31 memset(map,0,sizeof(map)); 32 memset(in,0,sizeof(in)); 33 memset(topsort,0,sizeof(topsort)); 34 for(i=0;i<m;i++) 35 { 36 scanf("%d%d",&a,&b); 37 if(map[a][b] == 0) 38 { 39 map[a][b] = 1; 40 in[b]++; 41 } 42 } 43 tsort(); 44 for(i=1;i<n;i++) 45 printf("%d ",topsort[i]); 46 printf("%d ",topsort[i]); 47 } 48 }