拓扑排序所有可能java_拓扑排序获取所有可能序列JAVA实现

packagegraphics.dag.topologicalsort;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;/*** 有向无环图所有的走法

*@authorzhangxinren

**/

public classTopologicalSort {//所有的走法

private static List> result = new ArrayList<>();//顶点和边的邻接表

private static int[][] edges = {//14个顶点,索引0不用,邻接表

{},

{3},

{4},

{4,5},

{6},

{6},

{7,11},

{8},

{13},

{10},

{11},

{12},

{13},

{14},

{}

};//每条边的入度

private static int[] inDegree;//邻接表元素个变化,inDegree初始长度也变化//当前可以走的边(入度为0的边)

private static List next = new ArrayList<>();;

// 思路:利用递归,每次递归用掉一个入度为0的顶点,将用掉的顶点加入临时结果中,当没有入度为0的顶点时,将临时结果加入结果集中,

// 每用掉一个入度为0的顶点,更新顶点的入度数组和入度为0的顶点的数组public static void topologicalSort(List oneResult, int[] inDegree, Listnext){if(next.size() > 0){for(int i = 0; i < next.size(); i++){

List tempNext = new ArrayList<>(next);

List tempOneResult = new ArrayList<>(oneResult);

tempNext.remove(next.get(i));

tempOneResult.add(next.get(i));int[] tempInDegree =Arrays.copyOf(inDegree, inDegree.length);int[] tempEdges =edges[next.get(i)];for(int j = 0; j < tempEdges.length; j++){

tempInDegree[tempEdges[j]]--;if(tempInDegree[tempEdges[j]] == 0){

tempNext.add(tempEdges[j]);

}

}

topologicalSort(tempOneResult, tempInDegree, tempNext);

}

}else{

result.add(oneResult);

}

}public static voidmain(String[] args) {//索引0不用

inDegree = new int[15];for(int i = 0; i < inDegree.length; i++){

inDegree[i]= 0;

}for(int i = 1; i < edges.length; i++){for(int j = 0; j < edges[i].length; j++){

inDegree[edges[i][j]]++;

}

}for(int i = 1; i < inDegree.length; i++){if(inDegree[i] == 0){

next.add(i);

}

}

topologicalSort(new ArrayList<>(), inDegree, next);for(int i = 0; i < result.size(); i++){for(int j = 0; j < result.get(i).size(); j++){

System.out.print(result.get(i).get(j)+ " ");

}

System.out.println();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java实现图的拓扑序列的完整源代码: ``` import java.util.*; public class TopologicalSort { private int V; // 顶点数量 private LinkedList<Integer>[] adj; // 邻接表 public TopologicalSort(int v) { V = v; adj = new LinkedList[v]; for (int i = 0; i < v; ++i) { adj[i] = new LinkedList(); } } // 添加一条有向边 public void addEdge(int v, int w) { adj[v].add(w); } // 拓扑排序 public void topologicalSort() { // 统计每个顶点的入度 int[] indegree = new int[V]; for (int i = 0; i < V; ++i) { ListIterator<Integer> it = adj[i].listIterator(); while (it.hasNext()) { int j = it.next(); ++indegree[j]; } } // 将所有入度为0的顶点加入队列 Queue<Integer> queue = new LinkedList(); for (int i = 0; i < V; ++i) { if (indegree[i] == 0) { queue.add(i); } } // 依次取出队首顶点并输出 int count = 0; while (!queue.isEmpty()) { int i = queue.poll(); System.out.print(i + " "); ++count; // 将所有i指向的顶点的入度减1,如果减为0则加入队列 ListIterator<Integer> it = adj[i].listIterator(); while (it.hasNext()) { int j = it.next(); --indegree[j]; if (indegree[j] == 0) { queue.add(j); } } } // 如果count不等于V则说明图中存在环 if (count != V) { System.out.println("Graph contains cycle"); } } public static void main(String args[]) { TopologicalSort g = new TopologicalSort(6); g.addEdge(5, 2); g.addEdge(5, 0); g.addEdge(4, 0); g.addEdge(4, 1); g.addEdge(2, 3); g.addEdge(3, 1); System.out.println("Topological sort:"); g.topologicalSort(); } } ``` 这里使用了邻接表来存储图,通过统计每个顶点的入度以及将入度为0的顶点加入队列的方式来实现拓扑排序。如果在排序过程中发现图中存在环,则输出 "Graph contains cycle"。在main函数中创建了一个有向图并进行了拓扑排序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值