深度优先实现拓扑排序--java

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
*/

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/cumtwyc/article/details/49357195
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞