无前趋的顶点优先的拓扑排序方法(JAVA)(转载http://128kj.iteye.com/blog/1706968)
该方法的每一步总是输出当前无前趋(即人度为零)的顶点,其抽象算法可描述为:
NonPreFirstTopSort(G){//优先输出无前趋的顶点
while(G中有人度为0的顶点)do{
从G中选择一个人度为0的顶点v且输出之;
从G中删去v及其所有出边;
}
if(输出的顶点数目<|V(G)|)
//若此条件不成立,则表示所有顶点均已输出,排序成功。
Error("G中存在有向环,排序失败!");
}
- import java.util.Arrays;
- import java.util.List;
- import java.util.ArrayList;
- import java.util.Stack;
- public class Graph {
- int vertexNum; //图的顶点数
- ArrayList<ArrayList<Integer>> table; //图的邻接表,table.get(i)存放与i邻接的顶点
- Stack<Integer> stack; //存放入度为0的顶点
- int[] result; //拓朴排序的结果
- int[] in;// 入度,in[i]表示顶点i的入度
- /**
- *
- * 构造一个图
- *
- * @param num
- * 图的顶点数
- *
- */
- public Graph(int num) {
- vertexNum = num;
- table = new ArrayList<ArrayList<Integer>> (vertexNum);
- ;i<vertexNum;i++)
- table.add(new ArrayList<Integer>());
- stack = new Stack<Integer>();
- result = new int[vertexNum];
- in = new int[vertexNum];
- }
- /**
- * 向图中添加无向边
- *
- * @param I
- * 边的一个顶点
- * @param J
- * 边的另一个顶点
- * @return 是否添加成功
- */
- public boolean addEdge(int I, int J) {
- /**
- * 判断用户输入的是否是一个顶点,如果是,则返回flase,添加不成功
- */
- if (J == I) {
- return false;
- }
- /**
- * 判断所输入的顶点值是否在图所顶点范围值内,如果不在,则提示顶点不存在
- *
- */
- ) {
- /**
- *
- * 判断边是否存在
- */
- if (isEdgeExists(I, J)) {
- return false;
- }
- /**
- * 添加边,将孤头的入度加1
- */
- table.get(I).add(J);
- in[J]++;
- return true;
- }
- return false;
- }
- /**
- * 判断有向边是否存在
- *
- * @param i
- * 要查询的有向边的一个孤尾
- * @param j
- * 要查询的有向边的另一个孤头
- * @return 边是否存在,false:不存在,true:存在
- */
- public boolean isEdgeExists(int i, int j) {
- /**
- * 判断所输入的顶点值是否在图所顶点范围值内,如果不在,则提示顶点不存在
- *
- */
- ) {
- if (i == j) {
- return false;
- }
- /**
- * 判断i的邻接结点集是否为空
- */
- if (table.get(i) == null) {
- return false;
- }
- /**
- * 判断这条边是否存在,如果存在,则提示边已经存在
- */
- ; q < table.get(i).size(); q++) {
- if (((Integer) table.get(i).get(q)).intValue() == j) {
- System.out.println("顶点" +i+"和"+"顶点"+j+ "这两点之间存在边");
- return true;
- }
- }
- }
- return false;
- }
- public void TopSort() { //无前趋的顶点优先的拓扑排序方法
- ; i < vertexNum; i++) //无前趋的顶点入栈
- )
- stack.push(i);
- ;
- while (!stack.isEmpty()) {
- result[k] = (Integer) stack.pop(); //弹出一个无前趋的顶点,并放入拓扑排序的结果集
- if (table.get(result[k]) != null) { //这个顶点的邻接表非空
- ; j < table.get(result[k]).size(); j++) {
- int temp = (Integer) table.get(result[k]).get(j);
- //对result[k]每一个邻接点进行入度减1操作
- ) { //如果temp的入度为0,进栈.
- stack.push(temp);
- }
- }
- }
- k++;
- }
- if (k < vertexNum) {
- System.out.println("有回路");
- );
- }
- }
- public int[] getResult() {
- return result;
- }
- }
测试: 
- import java.util.List;
- public class GraphTest {
- public static void main(String args[]){
- );
- );
- );
- );
- );
- );
- );
- );
- );
- );
- graph.TopSort();
- int[] list = graph.getResult();
- System.out.println("拓扑排序的结果为:");
- for(int i : list){
- System.out.print(i+" ");
- }
- }
- }
运行:
C:\>java GraphTest
拓扑排序的结果为:
4 2 1 3 5 0
下载源码
- graphtoposort.zip (1.8 KB)
- 下载次数: 0
无前趋的顶点优先的拓扑排序方法(JAVA)(转载http://128kj.iteye.com/blog/1706968)的更多相关文章
- 有向图的拓扑排序算法JAVA实现
一,问题描述 给定一个有向图G=(V,E),将之进行拓扑排序,如果图有环,则提示异常. 要想实现图的算法,如拓扑排序.最短路径……并运行看输出结果,首先就得构造一个图.由于构造图的方式有很多种,这里假 ...
- 算法笔记_023:拓扑排序(Java)
目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...
- tsort - 拓扑排序
tsort - 拓扑排序 本文链接:http://codingstandards.iteye.com/blog/834572 (转载请注明出处) 用途说明 tsort命令通常用于解决一种逻辑问题, ...
- 有向无环图的应用—AOV网 和 拓扑排序
有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...
- 大数据工作流任务调度--有向无环图(DAG)之拓扑排序
点击上方蓝字关注DolphinScheduler(海豚调度) |作者:代立冬 |编辑:闫利帅 回顾基础知识: 图的遍历 图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点 ...
- 关于拓扑排序(topologicalsort)
假设我们有一组任务要完成,并且有些任务要在其它任务完成之后才能开始,所以我们必须非常小心这些任务的执行顺序.如果这些任务的执行顺序足够简单的话,我们可以用链表来存储它们,这是一个很好的方案,让我们可以 ...
- 有向图的拓扑排序的理解和简单实现(Java)
如果图中存在环(回路),那么该图不存在拓扑排序,在这里我们讨论的都是无环的有向图. 什么是拓扑排序 一个例子 对于一部电影的制作过程,我们可以看成是一个项目工程.所有的工程都可以分为若干个" ...
- 拓扑排序(topsort)
本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 和离散数学中偏序/全序概念的联系 典型实现算法解的唯一性问题 Kahn算法 基于DFS的算法 实际例子 取材自以下材料: http://e ...
- hdu4324 Triangle LOVE (拓扑排序)
这是一道最简单的拓扑排序题,好久没看这个算法了! 有点生疏了! 后附上百度的资料; #include<stdio.h> #include<string.h> int in[50 ...
随机推荐
- SQL一字段内的字符串按照特定字符串转化为多行显示
有如下数据表 需求就是将Col1,Col2按照特定的字符串分割成多行 一.利用XML解析方式 先将该字段值统一替换为逗号分割,再将逗号分割替换转为XML数据类型,再利用xml转为多个行 declare ...
- Alpha冲刺报告(3/12)(麻瓜制造者)
今日已完成情况: 肖小强: 解决了之前的部署demo问题,学习了基本需要的api 江郑: 进行发布需求数据库的增删改查 邓弘立: 完成了轮播图的设计 刘双玉: 编码发布商品的接口,数据库表的修改 汪志 ...
- 封装Ajax框架!(前言篇)
Ajax技术就是利用javascript和xml实现异步交互的功能. 首先先来介绍一下Ajax相关知识点,如果这些你都会的话,请直接跳转到封装ajax框架!(代码篇) 一.Ajax对象的创建 1.创建 ...
- 【洛谷】【单调栈】P1901 发射站
[题目描述:] 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发 ...
- Git系列七之备份迁移 升级 恢复管理
0.Gitlab安装 1.安装和配置必要的依赖关系在CentOS7,下面的命令将在系统防火墙打开HTTP和SSH访问. yum install curl openssh-server postfix ...
- mac apache的使用
因为apache的安装目录/private/etc是默认隐藏的,所以我们需要通过文件夹前往/命令行的方法去找. 或命令行中输入: userdeMBP:~ user$ open /etc 然后都会打开相 ...
- Postman-断言和Runner
断言(部分) // 推荐用全等 ===,确保类型和值都一致 tests['Status code is 200'] = responseCode.code === 200; //判断响应结果是否是20 ...
- Jemeter编写脚本(五类常见请求)
http://blog.csdn.net/musen518/article/details/50601364 (原文地址) (Windows系统 点击 F12 调出开发者工具,选择Network, ...
- find和find_if
find函数 是在一个迭代器范围内查找特定元素得函数,可将将他用于任意容器类型得元素.这个函数返回的是所找元素得引用,如果没有找到元素就会返回这个容器得尾迭代器. #include <iostr ...
- win10家庭版安装DockerToolbox-18.03.0-ce
下载DockerToolbox-18.03.0-ce.exe https://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ 点击安 ...