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

  在看算法基础这本书,看到有向无环图,其中介绍到了拓扑排序,讲到了获取拓扑序列的方法,结合自己的理解,用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();
        }
    }
}

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

原文地址:https://www.cnblogs.com/liunianfeiyu/p/9747519.html

时间: 2024-10-10 10:46:53

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

HDU-1285 简单拓扑排序

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 35253    Accepted Submission(s): 13787 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

拓扑排序总结

AOV网与拓扑排序 ㈠AOV网概念             在有向图中,若用顶点表示活动,有向边表示活动顺序,称该有向图为顶点表示活动的网络,简称AOV网.在AOV网中,若从顶点i到顶点j之间存在一条有向路径,称顶点i是顶点j的前驱,或顶点j是顶点i的后继.若<i,j>是图中的边,则称i是j的直接前驱,j是i直接后继. ㈡AOV网的实际意义              在一个大的工程中,常被划分为许多较小的子工程,在整个工程实施过程中,有些活动的开始是以它的所有前序活动结束为先决条件的,而有些则

【日常学习】【拓扑排序】家谱树&amp;FZU1483 Sicily1424 奖金 题解

拓扑排序的定义 简单来说就是给你一个图写出一个序列 图中如果a通向b 那么序列中A必须排在B前面 拓扑排序可能有很多结果 必须是有向无环图 可以利用拓扑排序来判定环的存在 当然也可以用神奇的SPFA 但是拓扑排序时间复杂度很低 只有O(V+E) 基本实现思路是 每次取出入度为0的点 然后删除与它相连的边 直到没有边  如果还有边但是找不到入度为0的点 说明有环 学习这个算法联系了两道题目 很经典很单纯 但是一般没有OJ有评测 奖金这道题目在福州大学OJ和中山大学萌萌哒Sicily上找到了评测(为

图基本算法 拓扑排序(基于dfs)

拓扑排序,是对有向无回路图进行排序,以期找到一个线性序列,这个线性序列在生活正可以表示某些事情完成的相应顺序.如果说所求的图有回路的话,则不可能找到这个序列. 在大学数据结构课上,我们知道求拓扑排序的一种方法.首先用一个入度数组保存每个顶点的入度.在进行拓扑排序时,我们需要找到入度为0的点,将其存入线性序列中,再将其从图中删除(与它相关的边都删除,相邻的顶点的入度均减1),再重复上面的操作,直至所有的顶点都被找到为止.如果不对每次找入度为0的顶点的方法进行处理,而直接去遍历入度数组,则该算法的时

图的拓扑排序

定义: 图的拓扑排序是对有向无环图来说的,无向图和有环图没有拓扑排序,或者说不存在拓扑排序,对于一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若图G存在边< u, v >,则u在线性序列中出现在v之前.对一个有向无环图进行拓扑排序产生的线性序列称为满足拓扑次序的序列.一个有向无环图可以表示某种动作或者方案,或者状态,而有向无环图的拓扑序列通常表示某种某案切实可行或者各个成员之间的某种关系. 举个栗子,看上面那个图,v1v2v3v4v5v6v7v8是

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

目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进行排序.即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,顶点u总是在顶点v的前面. 2 解决方案 2.1 基于减治法实现 实现原理:不断地做这样一件事,在余下的有向图中求取一个源(source)(PS:定义入度为0的顶点为有向图的源),它是一个没有输入边的顶点,然后把它和所有从它出发

拓扑排序之变量序列算法分析

拓扑排序之变量序列 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 题目描述: 假设有n个变量(1<=n<=26,变量名用单个小写字母表示),还有m个二元组(u,v),分别表示变量u小于v.那么,所有变量从小到大排列起来应该是什么样子的呢? 例如有4个变量a,b,c,d,若以知a<b,c<b,d<c,则这4个变量的排序可能是a<d<c<b.尽管还有可能其他的可能,你只需找出其中的一个即可. 输入: 输入为一

JAVA邻接表实现拓扑排序

由于一直不适用邻接表 ,现在先贴一段使用邻接矩阵实现图的拓扑排序以及判断有无回路的问题.自己做的图.将就看吧. package TopSort; import java.util.LinkedList; import java.util.Scanner; /*拓扑序列:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性 * 序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前. * */ p

拓扑排序之变量序列代码

/* Name: Copyright: Author: Date: 17-11-14 21:02 Description: 拓扑排序之变量序列 假设有n个变量(1<=n<=26,变量名用单个小写字母表示),还有m个二元组(u,v),分别表示变量u小于v.那么,所有变量从小到大排列起来应该是什么样子的呢? 例如有4个变量a,b,c,d,若以知a<b,c<b,d<c,则这4个变量的排序可能是a<d<c<b.尽管还有可能其他的可能,你只需找出其中的一个即可. In