拓扑排序
一.概念
由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
二.拓扑排序方法如下:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
三.算法实现
1.普通实现
1 #include<iostream> 2 #include<stdlib.h> 3 #include<stdio.h> 4 #define MAX 100 5 using namespace std; 6 7 void toposort(int map[MAX][MAX],int indegree[MAX],int n) 8 { 9 int i,j,k; 10 for(i=0;i<n;i++) //遍历n次 11 { 12 for(j=0;j<n;j++) //找出入度为0的节点 13 { 14 if(indegree[j]==0) 15 { 16 indegree[j]--; 17 cout<<j<<endl; 18 for(k=0;k<n;k++) //删除与该节点关联的边 19 { 20 if(map[j][k]==1) 21 { 22 indegree[k]--; 23 } 24 } 25 break; 26 } 27 } 28 } 29 } 30 31 32 int main(void) 33 { 34 int n,m; //n:关联的边数,m:节点数 35 while(scanf("%d %d",&n,&m)==2&&n!=0) 36 { 37 int i; 38 int x,y; 39 int map[MAX][MAX];//邻接矩阵 40 int indegree[MAX];//入度 41 memset(map,0,sizeof(map)); 42 memset(indegree,0,sizeof(indegree)); 43 for(i=0;i<n;i++) 44 { 45 scanf("%d %d",&x,&y); 46 if(!map[x][y])//防止入度重复加 47 { 48 map[x][y]=1; 49 indegree[y]++; 50 } 51 } 52 toposort(map,indegree,m); 53 } 54 //while(1); 55 return 0; 56 } 57 58 59 //http://www.cnblogs.com/dolphin0520/archive/2011/04/16/2017737.html
2.递归实现
1 int c[maxn]; 2 int topo[maxn],t; 3 4 bool dfs(int u) 5 { 6 c[u]=-1;//正在访问该顶点 7 for(int v=0; v<n; v++) 8 { 9 if(G[u][v]==1) 10 { 11 if(c[v]<0) return false;//存在环 12 //c[v]=-1代表正在访问该定点(即递归调用dfs(u)正在帧栈中,尚未返回) 13 else if(!c[v] && !dfs(v)) return false; 14 //(c[v]==0 && dfs(v)==false即当前顶点没有后继顶点时 15 16 } 17 } 18 19 c[u]=1; //访问结束 20 topo[--t]=u; 21 return true; 22 } 23 24 bool toposort() 25 { 26 t=n; 27 memset(c,0,sizeof(c)); 28 29 for(int u=0; u<n; u++) 30 if(!c[u]) 31 if(!dfs()) 32 return false; 33 return ture; 34 }
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.