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

来源:互联网 发布:php使用html模板 编辑:程序博客网 时间:2024/06/02 04:23
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 22 42 35 35 66 73 71 48 49 9拓扑排序结果:1 2 8 4 5 3 6 7 9*/

1 0
原创粉丝点击