拓扑排序 java

import java.util.*;
/** * 拓扑排序:(1)在有向图中选一个没有前驱的顶点且输出之  (2)从图中删除该顶点和所有以它为尾的弧 * 重复以上两步骤,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。后者说明有向图中有环。              *  */
public class TopologicalTest {    private static final int V_COUNT = 12;    public static void main(String[] args) {        //初始化节点        Topological topological1 = new Topological("C1", 0, new ArrayList<Topological>());        Topological topological2 = new Topological("C2", 1, new ArrayList<Topological>());        Topological topological3 = new Topological("C3", 2, new ArrayList<Topological>());        Topological topological4 = new Topological("C4", 1, new ArrayList<Topological>());        Topological topological5 = new Topological("C5", 2, new ArrayList<Topological>());        Topological topological6 = new Topological("C6", 1, new ArrayList<Topological>());        Topological topological7 = new Topological("C7", 2, new ArrayList<Topological>());        Topological topological8 = new Topological("C8", 2, new ArrayList<Topological>());        Topological topological9 = new Topological("C9", 0, new ArrayList<Topological>());        Topological topological10 = new Topological("C10", 1, new ArrayList<Topological>());        Topological topological11 = new Topological("C11", 1, new ArrayList<Topological>());        Topological topological12 = new Topological("C12", 3, new ArrayList<Topological>());

        //将节点添加后驱        List<Topological> list = topological1.getTopologicals();        list.add(topological2);        list.add(topological4);        list.add(topological12);        list.add(topological3);        topological1.setTopologicals(list);

        list = topological2.getTopologicals();        list.add(topological3);        topological2.setTopologicals(list);

        list = topological3.getTopologicals();        list.add(topological5);        list.add(topological7);        list.add(topological8);        topological3.setTopologicals(list);

        list = topological4.getTopologicals();        list.add(topological5);        topological4.setTopologicals(list);

        list = topological5.getTopologicals();        list.add(topological7);        topological5.setTopologicals(list);

        list = topological6.getTopologicals();        list.add(topological8);        topological6.setTopologicals(list);

        list = topological9.getTopologicals();        list.add(topological10);        list.add(topological11);        list.add(topological12);        topological9.setTopologicals(list);

        list = topological10.getTopologicals();        list.add(topological12);        topological10.setTopologicals(list);

        list = topological11.getTopologicals();        list.add(topological6);        topological11.setTopologicals(list);

        //将图中的节点放入列表        List<Topological> topologicals = new ArrayList<Topological>();        topologicals.add(topological1);        topologicals.add(topological2);        topologicals.add(topological3);        topologicals.add(topological4);        topologicals.add(topological5);        topologicals.add(topological6);        topologicals.add(topological7);        topologicals.add(topological8);        topologicals.add(topological9);        topologicals.add(topological10);        topologicals.add(topological11);        topologicals.add(topological12);

        //定义一个列表来存放入度为零的节点        List<Topological> topologicalListForReturn = new ArrayList<Topological>();        int i = 0;        while(i++ <= V_COUNT) {            for(Topological each : topologicals) {                //判断一下是否已经在入度为0的列表中                //如果是,则返回,判断下一个                if(topologicalListForReturn.contains(each)) {                    continue;                }                if(each.getIndegree() == 0) {                    for(Topological topological : each.getTopologicals()) {                        topological.setIndegree(topological.getIndegree() - 1);                    }                    topologicalListForReturn.add(each);                    break;                }            }        }

        //如果入度为0的节点数少于图总节点数,则存在环        if(topologicalListForReturn.size() < topologicals.size()) {            System.out.println("此图存在环");        }else {            for(Topological each : topologicalListForReturn) {                System.out.print(each.getName() + " ");            }        }    }}

总结:入度为0的顶点即为没有前驱的顶点,删除顶点及以它为尾的弧的操作,则可换成以弧头顶点的入度减1来实现。
时间: 2024-10-03 23:06:40

拓扑排序 java的相关文章

有向图和拓扑排序Java实现

package practice; import java.util.ArrayDeque; import java.util.Iterator; import java.util.Stack; public class TestMain { public static void main(String[] args) { Digraph a = new Digraph(13); a.addEdge(0, 1);a.addEdge(0, 5);/*a.addEdge(2, 3);*/a.addE

hdu1285 拓扑排序 java实现

/* 解题思路: 这是一个典型的拓扑排序,这里我们需要从输入的时候获取没个点的入度,若入度为零的, 我们可以从小到大依次输出来.每当输出一个点时,需要把它所广联的边全部消除 (即把该点所相连的点的入度减一),重复上面操作. */ import java.util.Scanner; public class Main { //定义全局变量,方面后面使用 static int n,m; //比赛队伍数和输入比赛结果次数 static int[] degree,sorted; //每个点的入度数和是否

简单易懂的拓扑排序

1.定义 对一个有向无环图(Directed Acyclic Graph简称DAG) G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前.通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列.简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序. 在AOV网中,若不存在回路,则所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前

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

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

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

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

在看算法基础这本书,看到有向无环图,其中介绍到了拓扑排序,讲到了获取拓扑序列的方法,结合自己的理解,用JAVA代码实现了获取所有可能序列,水平有限,效率什么的就没有考虑,下面贴上代码: package graphics.dag.topologicalsort; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 有向无环图所有的走法 * @author zhangxinren * */

java实现AOV图的拓扑排序

拓扑排序作为图的应用,了解拓扑排序必须首先了解AOV图. AOV网表示一个有向图中顶点,用弧表示顶点之间的优先关系.如下图所示,在AOV网中,若从顶点vi到顶点vj之间存在一条有向路径,则称顶点vi为顶点vj的前驱,顶点vj为顶点vi的后继.注意,AOV图不能有回路,否则会将序列陷入死循环,称为死锁. 进行拓扑排序,一般步骤如下: <1>在AOV网中选择一个入度为0的顶点 <2>在AOV网中删除此顶点及其相连的有向边 <3>重复步骤<1>和<2>

HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9267    Accepted Submission(s): 2668 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想

HDU 3342 Legal or Not (最短路 拓扑排序?)

Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6580    Accepted Submission(s): 3088 Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is