在看算法基础这本书,看到有向无环图,其中介绍到了拓扑排序,讲到了获取拓扑序列的方法,结合自己的理解,用JAVA代码实现了获取所有可能序列,水平有限,效率什么的就没有考虑,下面贴上代码:

package graphics.dag.topologicalsort;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; /**
* 有向无环图所有的走法
* @author zhangxinren
*
*/
public class TopologicalSort {
// 所有的走法
private static List<List<Integer>> 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<Integer> next = new ArrayList<>();;

  // 思路:利用递归,每次递归用掉一个入度为0的顶点,将用掉的顶点加入临时结果中,当没有入度为0的顶点时,将临时结果加入结果集中,
  // 每用掉一个入度为0的顶点,更新顶点的入度数组和入度为0的顶点的数组
public static void topologicalSort(List<Integer> oneResult, int[] inDegree, List<Integer> next){
if(next.size() > 0){
for(int i = 0; i < next.size(); i++){
List<Integer> tempNext = new ArrayList<>(next);
List<Integer> 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 void main(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();
}
}
}

  经过测试,没有发现问题,供大家参考,代码写得不好的地方还请包涵,如有不理解的地方请结合拓扑排序的相关知识加以理解。

拓扑排序获取所有可能序列JAVA实现的更多相关文章

  1. HDU 1811 Rank of Tetris 【拓扑排序】+【并查集】

    <题目链接> 题目大意: 给你N个点(编号从0到N-1)和M个关系,要你判断这个图的所有点的顺序是否可以全部确定.不过对于任意点的关系可能存在A>B或A<B或A=B三种情况,如 ...

  2. 拓扑排序(三)之 Java详解

    前面分别介绍了拓扑排序的C和C++实现,本文通过Java实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处 ...

  3. 算法笔记_023:拓扑排序(Java)

    目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...

  4. Java实现拓扑排序

    1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进行排序.即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,顶点u总是在顶点 ...

  5. 有向图的拓扑排序算法JAVA实现

    一,问题描述 给定一个有向图G=(V,E),将之进行拓扑排序,如果图有环,则提示异常. 要想实现图的算法,如拓扑排序.最短路径……并运行看输出结果,首先就得构造一个图.由于构造图的方式有很多种,这里假 ...

  6. 有向图的拓扑排序的理解和简单实现(Java)

    如果图中存在环(回路),那么该图不存在拓扑排序,在这里我们讨论的都是无环的有向图. 什么是拓扑排序 一个例子 对于一部电影的制作过程,我们可以看成是一个项目工程.所有的工程都可以分为若干个" ...

  7. JAVA邻接矩阵实现拓扑排序

    由于一直不适用邻接表 ,现在先贴一段使用邻接矩阵实现图的拓扑排序以及判断有无回路的问题.自己做的图.将就看吧. package TopSort; import java.util.LinkedList ...

  8. [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果

    [C#]使用 C# 代码实现拓扑排序   目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...

  9. Java排序算法——拓扑排序

    package graph; import java.util.LinkedList; import java.util.Queue; import thinkinjava.net.mindview. ...

随机推荐

  1. yii2 rbac权限管理学习笔记

    下面介绍一个 yii2 的 Rbac 权限管理设置,闲话少说,直接上代码, 1.首先我们要在组件里面配置一下 Rbac ,如下所示(common/config/main-local.php或者main ...

  2. Apache Shiro在web开发安全框架中的应用

    前阶段就hadoop的分享了一些内容,希望对新手入门的朋友有点帮助吧!对于hadoop新手入门的,还是比较推荐大快搜索的DKHadoop发行版,三节点标准版还是值得拥有的(三节点的标准版是可以免费下载 ...

  3. PHP接收表单(GET/POST)时,表单名中的点变成了下划线怎么办?

    如果开发中发现,从表单中传递上来的表单名称后端接不到值,不要惊慌,很有可能是表单名称中带有特殊字符(.和空格) PHP接收参数时,发现表单名中如果是 句号(.)或者空格( ),会被转换成下划线(_) ...

  4. python 异常类型----后期需理解调整

    1.Python内建异常体系结构The class hierarchy for built-in exceptions is: BaseException +-- SystemExit +-- Key ...

  5. Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析

    转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...

  6. vue 之radio绑定v-model

    示例: 单选radio <label ><input type="radio" value="0" v-model="branch& ...

  7. cpu监控之三:mpstat命令

    mpstat是MultiProcessor Statistics的缩写,是实时系统监控工具.报告CPU的一些统计信息,这些信息存放在/proc/stat文件中.在多CPUs系统里,其不但能查看所有CP ...

  8. Python- 解决PIP下载安装速度慢 让PIP源使用国内镜像,提升下载速度和安装成功率。

    原文: https://www.cnblogs.com/microman/p/6107879.html 对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间. ...

  9. [UE4]C++ 动态内存分配(6种情况,好几个例子)

    1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对 ...

  10. Linux网络编程经典书籍推荐

    UNIX环境高级编程<高级unix环境编程><unix网络编程><深入理解计算机系统>比较好 =====================Linux网络编程经典书籍推 ...