作者:酒心灵20609 | 来源:互联网 | 2023-10-11 12:36
转自:http:blog.chinaunix.netuid-20384806-id-1954187.html对一个有向无环图(DirectedAcyclicGraph
转自:http://blog.chinaunix.net/uid-20384806-id-1954187.html
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。
通常,这样的线性序列称为满足拓扑次序(TopoiSicai Order)的序列,简称拓扑序列。 注意: ①若将图中顶点按拓扑次序排成一行,则图中所有的有向边均是从左指向右的。 ②若图中存在有向环,则不可能使顶点满足拓扑次序。 ③一个DAG的拓扑序列通常表示某种方案切实可行。 下面是Java实现:
/*** 有方向图* */
public class DirectedGraph {private final int MAX_VERTS = 20;private Vertex[] vertexList; // array of verticesprivate int[][] adjMat; // adjacency matrixprivate int nVerts; // current number of verticesprivate char[] sortedArray; // sorted vert labels/*** 默认构造函数 初始化邻接矩阵*/public DirectedGraph() {vertexList = new Vertex[MAX_VERTS];sortedArray = new char[MAX_VERTS];// 图的邻接矩阵adjacency matrixadjMat = new int[MAX_VERTS][MAX_VERTS];nVerts = 0;for (int j = 0; j 0) {int delVertex = getNoSuccessorVertex();if (-1 == delVertex) {System.out.println("Error: This graph has cycles! It cannot be toplogical sorted.");return;}sortedArray[nVerts - 1] = vertexList[delVertex].label;deleteVertex(delVertex);}System.out.print("Topologically sorted order: ");for (int j = 0; j 0)// 大于0,表明有边指向其他点,说明有后继节点{isEdge = true;break; // OK,继续下一个节点}}if (false == isEdge)// 没有边,表明没有后继节点{return row;}}return -1;}/*** 删除一个节点* * @param delVertex*/public void deleteVertex(int delVertex) {if (delVertex != nVerts - 1)// 如果不是最后一个节点{// 在节点列表中删除这个节点,所有后面的节点前移一格for (int i = delVertex; i }