拓扑排序的实现java_java实现-拓扑排序

import java.util.Stack;

//拓扑排序

public class GraphTopologic {

private int numVertexes;

private VertexNode[] adjList;//邻接顶点的一维数组

public GraphTopologic(int numVertexes){

this.numVertexes = numVertexes;

}

//拓扑排序

public void topologicSort(){

Stack stack = new Stack<>();

int count = 0;

int k = 0;

for(int i = 0;i < numVertexes;i++){

if(adjList[i].in == 0){

stack.push(i);

}

}

while(!stack.isEmpty()){

int pop = stack.pop();

System.out.println("顶点:" + adjList[pop].data);

count++;

for(EdgeNode node = adjList[pop].firstEdge;node != null;node = node.next){

k = node.adjvex;//下标

if(--adjList[k].in == 0){

stack.push(k); //入度为0 入栈

}

}

}

}

private void createGraph(){

VertexNode node0 = new VertexNode(0,"v0");

VertexNode node1 = new VertexNode(0,"v1");

VertexNode node2 = new VertexNode(2,"v2");

VertexNode node3 = new VertexNode(0,"v3");

VertexNode node4 = new VertexNode(2,"v4");

VertexNode node5 = new VertexNode(3,"v5");

VertexNode node6 = new VertexNode(1,"v6");

VertexNode node7 = new VertexNode(2,"v7");

VertexNode node8 = new VertexNode(2,"v8");

VertexNode node9 = new VertexNode(1,"v9");

VertexNode node10 = new VertexNode(1,"v10");

VertexNode node11 = new VertexNode(2,"v11");

VertexNode node12 = new VertexNode(1,"v12");

VertexNode node13 = new VertexNode(2,"v13");

adjList = new VertexNode[numVertexes];

adjList[0] =node0;

adjList[1] =node1;

adjList[2] =node2;

adjList[3] =node3;

adjList[4] =node4;

adjList[5] =node5;

adjList[6] =node6;

adjList[7] =node7;

adjList[8] =node8;

adjList[9] =node9;

adjList[10] =node10;

adjList[11] =node11;

adjList[12] =node12;

adjList[13] =node13;

node0.firstEdge = new EdgeNode(11);node0.firstEdge.next = new EdgeNode(5);node0.firstEdge.next.next = new EdgeNode(4);

node1.firstEdge = new EdgeNode(8);node1.firstEdge.next = new EdgeNode(4);node1.firstEdge.next.next = new EdgeNode(2);

node2.firstEdge = new EdgeNode(9);node2.firstEdge.next = new EdgeNode(6);node2.firstEdge.next.next = new EdgeNode(5);

node3.firstEdge = new EdgeNode(13);node3.firstEdge.next = new EdgeNode(2);

node4.firstEdge = new EdgeNode(7);

node5.firstEdge = new EdgeNode(12);node5.firstEdge.next = new EdgeNode(8);

node6.firstEdge = new EdgeNode(5);

node8.firstEdge = new EdgeNode(7);

node9.firstEdge = new EdgeNode(11);node9.firstEdge.next = new EdgeNode(10);

node10.firstEdge = new EdgeNode(13);

node12.firstEdge = new EdgeNode(9);

}

//边表结点

class EdgeNode{

private int adjvex;

private EdgeNode next;

private int weight;

public EdgeNode(int adjvex){

this.adjvex = adjvex;

}

public int getAdjvex() {

return adjvex;

}

public void setAdjvex(int adjvex) {

this.adjvex = adjvex;

}

public EdgeNode getNext() {

return next;

}

public void setNext(EdgeNode next) {

this.next = next;

}

}

//邻接顶点

class VertexNode{

private int in;//入度

private String data;

private EdgeNode firstEdge;

public VertexNode(int in,String data){

this.in = in;

this.data = data;

}

public int getIn() {

return in;

}

public void setIn(int in) {

this.in = in;

}

public String getData() {

return data;

}

public void setData(String data) {

this.data = data;

}

public EdgeNode getFirstEdge() {

return firstEdge;

}

public void setFirstEdge(EdgeNode firstEdge) {

this.firstEdge = firstEdge;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值