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

一个简单拓扑排序的 java 实现

2017-07-24 15:58 866 查看
如果含有圈,不可能进行拓扑排序,在这里我们假设图中不含圈。要将下图进行拓扑:



我们计算每个顶点的入度,将所有入读为零的顶点放入初始为空的队列,当队列不为空,删除一个顶点v,并将与v邻接的所有顶点的入度均减1。只要一个顶点的入度降为0,就把该点放入队列中。排序就是顶点出队的顺序。

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class Test {
//有向图的邻接矩阵表示法
static int [] [] matrix = {
{1,1,1,1,0,0,0},
{0,1,0,1,1,0,0},
{0,0,1,0,0,1,0},
{0,0,1,1,0,1,1},
{0,0,0,1,1,0,1},
{0,0,0,0,0,1,0},
{0,0,0,0,0,1,1} };

static int [] indegree = new int [7];
static int [] num = new int [7];

static void topsort() {
Queue<Integer> q = new LinkedList<>();
int counter = 0;

for(int i = 0; i < 7; i++)
if (indegree[i] == 0)
q.offer(i);

while( !q.isEmpty() ) {
int v = q.poll();
num[v] = counter++;

for(int i = 0; i < 7; i++)
if(v != i && matrix[v][i] == 1 && --indegree[i] == 0)
q.offer(i);
}
}

public static void main(String [] args) {
for(int i = 0; i < 7; i++) {
for(int j = 0; j < 7; j++)
if(matrix[j][i] == 1)
indegree[i]++;
indegree[i]--;
}

topsort();
System.out.println("各点拓扑编号:" + Arrays.toString(num));
}

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