Java创建图的拓扑排序

来源:互联网 发布:面向过程的c语言 编辑:程序博客网 时间:2024/06/01 14:08

拓扑排序算法:对一个有向无环图(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();
}
}
 

0 0
原创粉丝点击