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

import java.util.*;
public class Topology
{	
	static final int MAX = 20;	//最大点数
	static int[][] g; //图
	static LinkedList 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();
		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 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
*/

你可能感兴趣的:(算法与数据结构)