您的位置:首页 > 编程语言 > Java开发

Java创建图的拓扑排序

2015-03-01 16:39 169 查看
拓扑排序算法:对一个有向无环图(Directed
Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

算法实现:先找到那些没有后继节点的节点,所谓后继节点就是指:例如 A->B,那么B就是A的后继。就是要找这种没有后继节点的节点。,然后逆序输入。

import java.util.*;

import java.io.*;

class Ver

{

public char label;

public Ver(char lab)

{

this.label = lab;

}

}

class Gra

{

private final int MAX_VERTS = 20;

private Ver[] vertexList; //用来存储节点的数组

private int[][] adjMat; //邻接矩阵

private int nVerts; //节点个数

private char[] sortedArray;

public Gra()

{

vertexList = new Ver[MAX_VERTS]; //储存节点

adjMat = new int[MAX_VERTS][MAX_VERTS]; //邻接矩阵

nVerts = 0;

for(int i = 0; i < MAX_VERTS; i++)

{

for(int j = 0; j < MAX_VERTS; j++)

adjMat[i][j] = 0;

}

sortedArray = new char[MAX_VERTS];

}

public void addVertex(char lab)

{

vertexList[nVerts++] = new Ver(lab);

}

public void addEdge(int start,int end)

{

adjMat[start][end] = 1; //注意:只有一条有向边

}

public void displayVertex(int v)

{

System.out.print(vertexList[v].label);

}

public int noSuccessors() //返回没有后继节点的节点

{

boolean isEdge; //用来测试是否有后继节点

for(int row = 0; row < nVerts; row++)

{

isEdge = false;

for(int col = 0; col < nVerts; col++)

{

if(adjMat[row][col] > 0)

{

isEdge = true;

break; //若有后继节点,则中途给退出

}

}

if(! isEdge)

return row;

}

return -1;

}

public void deleteVertex(int delVert) //删除节点

{

if(delVert != nVerts - 1)

{

for(int j = delVert; j < nVerts - 1; j++)

vertexList[j]= vertexList[j+1];

for(int row = delVert; row < nVerts - 1; row++)

moveRowUp(row,nVerts);

for(int col = delVert; col < nVerts - 1; col++)

moveColLeft(col,nVerts-1);

}

nVerts--;

}

private void moveRowUp(int row, int length)

{

for(int col=0; col < length; col++)

adjMat[row][col] = adjMat[row+1][col];

}

private void moveColLeft(int col, int length)

{

for(int row=0; row<length; row++)

adjMat[row][col] = adjMat[row][col+1];

}

public void topo()

{

int orig_nVerts = nVerts;

while(nVerts > 0)

{

int currentVertex = noSuccessors(); //寻找后继节点

if(currentVertex == -1)

{

System.out.println("ERROR: Graph has cycles");

return;

}

//System.out.println(currentVertex);

sortedArray[nVerts-1] = vertexList[currentVertex].label;

//System.out.println(sortedArray[nVerts-1]);

deleteVertex(currentVertex);

}

System.out.print("Topologically sorted order: ");

for(int j = 0; j < orig_nVerts; j++)

System.out.print(sortedArray[j]); //注意这里要逆序输出

System.out.println("");

}

}

public class Topo

{

public static void main(String[] args)

{

Gra TheGraph = new Gra();

TheGraph.addVertex('A'); // 0

TheGraph.addVertex('B'); // 1

TheGraph.addVertex('C'); // 2

TheGraph.addVertex('D'); // 3

TheGraph.addVertex('E'); // 4

TheGraph.addVertex('F'); // 5

TheGraph.addVertex('G'); // 6

TheGraph.addVertex('H'); // 7

TheGraph.addEdge(0, 3); // AD

TheGraph.addEdge(0, 4); // AE

TheGraph.addEdge(1, 4); // BE

TheGraph.addEdge(2, 5); // CF

TheGraph.addEdge(3, 6); // DG

TheGraph.addEdge(4, 6); // EG

TheGraph.addEdge(5, 7); // FH

TheGraph.addEdge(6, 7); // GH

TheGraph.topo();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: