拓扑排序

来源:互联网 发布:mac os 自带php环境 编辑:程序博客网 时间:2024/06/10 01:22
思路:
分别找到没有后继节点的节点,加入数组,删掉,重复动作。

package tree;

import java.util.ArrayList;
import java.util.List;


public class TopoTest {

public static void main(String[] args) {
TopoGraph t = new TopoGraph(16);
t.addVertex("A");
t.addVertex("B");
t.addVertex("C");
t.addVertex("D");
t.addVertex("F");

t.addEdge(0, 1);
t.addEdge(1, 3);
t.addEdge(1, 2);
t.addEdge(2, 4);

t.printMatrix();

List<String> list = t.topo();
System.out.print("由先到后:");
for(String s:list){
System.out.print(s+" --> ");
}
}
}

class TopoGraph{
private List<Vert> vertexList;
private int[][] matrix= null;
private int maxSize = 20;

public TopoGraph(int maxSize){
vertexList = new ArrayList<Vert>(maxSize);
matrix = new int[maxSize][maxSize];
this.maxSize = maxSize;
}

//增加顶点
public void addVertex(String label){
if(isFull())
throw new ArrayIndexOutOfBoundsException("数组已经满了");
vertexList.add(new Vert(label));
}

private boolean isFull(){
return vertexList.size() == maxSize;
}

//增加边
public void addEdge(int start, int end){
int size = getSize();
if(start >= size || end >= size)
throw new ArrayIndexOutOfBoundsException();

this.matrix[start][end] = 1;
}

private int getSize(){
return this.vertexList.size();
}

//打印邻接矩阵
public void printMatrix(){
System.out.println();
int len = getSize();
for(int i = 0; i < len; i++){
for(int k = 0; k < len; k++){
System.out.print(matrix[i][k]);
}
System.out.println();
}
}

/**
* 拓扑遍历
* @return topo遍历之后的节点的label
*/
public List<String> topo(){
List<String> list = new ArrayList<>();
//扫描len次,找到len个后继节点
int len = getSize();
for(int i = 0; i < len; i++){
int index = 0;
int k = 0;
//目标节点扫描,是否为后继节点
for(; k < len; k++){
//如果是,则不是后继节点
if(matrix[index][k] == 1 && (!vertexList.get(k).isVisited())){
//改变目标节点,重新扫描,判断是否为后继节点
index = k;
k = 0;
}
}
//说明是没有后继的节点
if(k == len){
list.add(vertexList.get(index).getLabel());
vertexList.get(index).setVisited(true);
}
}
return list;
}
}
/**
* 顶点
* @author admin
*
*/
class Vert{
private String label;
private boolean isVisited;

public Vert(String label){
this.label = label;
this.isVisited = false;
}

public String getLabel() {
return label;
}

public void setLabel(String label) {
this.label = label;
}

public boolean isVisited() {
return isVisited;
}

public void setVisited(boolean isVisited) {
this.isVisited = isVisited;
}

}


0 0
原创粉丝点击