拓扑排序(含代码)
將圖中的結點以某種方式排成一個序列
一些概念
有向無環圖
即無環的有向圖
什么是活動
所有的?程或者某種流程都可以分為若?個?的?程或者階段,我們稱這些?的?程或階段
為“活動”。比如把大象裝進冰箱,第一步打開冰箱,第二步把大象裝進去,第三部關上冰箱門。這三步中的每一步便是一個活動
什么是AVO網
在?個表示?程的有向圖中,? 頂點表示活動,?弧表示活動之間的優先關系的有向圖 稱為
頂點表示活動的?(Activity On Vertex Network),簡稱AOV?。
什么是拓撲序列
設G=(V,E)是?個具有n個頂點的有向圖,V中的頂點序列 V1,V2,V3.......Vn滿?若從頂點Vi到Vj 有?條路徑,則在頂點序列中頂點Vi必在頂點Vj之前。則我們稱這樣的頂點序列為?個拓撲序列。
什么是拓撲排序
對一個有向無環圖構造拓撲序列的過程。官方的定義是由某個集合上的?個偏序得到該集合上的?個全序的操作過程稱為拓撲排序。
基本思想
若是圖中不存在無前驅的結點為止,則說明圖中存在環路,因此拓撲排序也可以作為一種檢查圖中是否有環路的方法
public void topology(GraphAdjList graphAdjList){Stack<Vert> stack = new Stack<>(); //存放入度為0的點Vert temp = null;//臨時變量接收出棧元素int count = 0;//已排序數量//int tempIndex;//臨時接收出棧元素的下標for (int i = 0; i < graphAdjList.vNums; i++) {//將入度為0的頂點進棧if(graphAdjList.verts[i].input==0){stack.push(graphAdjList.verts[i]);}}while(!stack.isEmpty()){temp = stack.pop();//tempIndex = getIndex(temp);//入度為0的頂點下標topoStack.push(temp);//存入拓撲序列count++;for (Edge edge = temp.firstEdge; edge.next!=null;edge = edge.next) {if(--graphAdjList.verts[edge.index].input==0){stack.push(graphAdjList.verts[edge.index]);}}}if(count!=graphAdjList.vNums){System.out.println("存在環路");}}總結
- 上一篇: 手机IMEI码规则介绍
- 下一篇: java控件数组_在C# WinForm