拓扑排序
来源:互联网 发布: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;
}
}
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 【拓扑排序】
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- libevent编程之bufferevent使用
- Linux(C/C++)下的文件操作open、fopen与freopen http://blog.csdn.net/a656343072/article/details/40539889
- 哈夫曼树--链式结构(建立huffman树、编码、解码)
- 哈夫曼树--顺序结构(建立、编码、解码)
- 无向图--邻接矩阵、连接矩阵、深度遍历、广度遍历、生成树
- 拓扑排序
- Routos设置ntp
- WarShall算法--图的传递闭包(进一步演变成flayd算法)
- 【转】 数学建模十大经典算法漫谈
- 字符串转换成日期,不多说,两句话 ,一句话
- hibernate查询和jdbc查询
- ROS(7):Lubuntu i386环境搭建ROS环境
- java设计模式
- apk反编译