拓扑排序(topological-sort)

来源:互联网 发布:ubuntu 打开anaconda 编辑:程序博客网 时间:2024/04/30 14:13

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。
什么是拓扑排序(Topological Sort)?简单地说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
拓扑排序就是求一个有向图的拓扑序列的算法。一个有向图顶点的拓扑序列不是惟一的。并不是任何有向图的顶点都可以排成拓扑序列,有环图是不能排的。
例子:比如排课问题,比如士兵排队问题等。

void TopologicalSort()/*输出拓扑排序函数。若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则返回ERROR*/ {       int indegree[M];       int i,k,j;       char n;       int count=0;       Stack thestack;       FindInDegree(G,indegree);//对各顶点求入度indegree[0....num]       InitStack(thestack);//初始化栈       for(i=0;i<G.num;i++)           Console.WriteLine("结点"+G.vertices[i].data+"的入度为"+indegree[i]);       for(i=0;i<G.num;i++)       {            if(indegree[i]==0)               Push(thestack.vertices[i]);       }       Console.Write("拓扑排序输出顺序为:");       while(thestack.Peek()!=null)       {                Pop(thestack.Peek());                j=locatevex(G,n);                if (j==-2)                   {                          Console.WriteLine("发生错误,程序结束。");                          exit();                   }                 Console.Write(G.vertices[j].data);                 count++;                 for(p=G.vertices[j].firstarc;p!=NULL;p=p.nextarc)                 {                      k=p.adjvex;                      if (!(--indegree[k]))                          Push(G.vertices[k]);                 }       }       if (count<G.num)           Cosole.WriteLine("该图有环,出现错误,无法排序。");       else          Console.WriteLine("排序成功。"); } 

算法的时间复杂度O(n+e)。

0 0
原创粉丝点击