import java.util.*;
public class Topology
{
static final int MAX = 20; //最大点数
static int[][] g; //图
static LinkedList<Integer> queue; //保存排序结果
static int[] ingoing; //记录节点入度
static int[] outgoing;//记录节点出度
static int[] used;
static int ver;
static int edge;
static void tplgOrd(){
//从所有出度为0的点开始遍历
for(int i=1;i<=ver;i++){
if(outgoing[i] == 0)
helper(i);
}
}
static void helper(int index){
//入度为0,说明没有先驱节点了
if(ingoing[index]==0) {
if(used[index]==0){used[index] = 1;queue.addLast(index);}
return;
}
//有边指向当前节点说明还有前驱节点,处理前驱节点
for(int i = 1;i <= ver;i++){
if(g[i][index] < Integer.MAX_VALUE) //有边相连
helper(i);
}
//到这里一定是所有的前驱节点都处理过了,所以只要把当前节点加入队列即可。
if(used[index] == 0){
used[index] = 1;
queue.addLast(index);
}
}
static void init(){
g = new int[ver+5][ver+5];
queue = new LinkedList<Integer>();
ingoing = new int[ver+5];
outgoing = new int[ver+5];
used = new int[ver+5];
for(int i=1;i<=ver;i++){
//初始S为空,Q为全部节点
for(int j=0;j<ver;j++)
g[i][j] = Integer.MAX_VALUE;
}
}
static void input(){
Scanner cin = new Scanner(System.in);
System.out.println("请输入 点数 边数");
ver = cin.nextInt();
edge = cin.nextInt();
int s,e,w;
init();
System.out.println("起点 终点");
for(int i=0;i<edge;i++){
s = cin.nextInt();
e = cin.nextInt();
g[s][e] = 1;
if(s != e){
ingoing[e] += 1;
outgoing[s] += 1;
}
}
}
static void print(){
System.out.println("拓扑排序结果:");
Iterator<Integer> iter = queue.iterator();
while(iter.hasNext()){
System.out.print(iter.next()+" ");
}
System.out.println();
}
public static void main(String[] args){
input();
tplgOrd();
print();
}
}
/*
请输入 点数 边数
9 10
起点 终点
1 2
2 4
2 3
5 3
5 6
6 7
3 7
1 4
8 4
9 9
拓扑排序结果:
1 2 8 4 5 3 6 7 9
*/
深度优先实现拓扑排序--java
原文作者:拓扑排序
原文地址: https://blog.csdn.net/cumtwyc/article/details/49357195
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/cumtwyc/article/details/49357195
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。