如果含有圈,不可能进行拓扑排序,在这里我们假设图中不含圈。要将下图进行拓扑:
我们计算每个顶点的入度,将所有入读为零的顶点放入初始为空的队列,当队列不为空,删除一个顶点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));
}
}