`
woxiaoe
  • 浏览: 276600 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

基于java的图(三) 图的拓扑排序

    博客分类:
  • Java
阅读更多

相关:

基于java的图的实现

 

基于java的图的实现(二) 图的两种遍历

 

 

方法一:

(1)在又向图中选一个没有前驱的点点输出。

(2)从图中删除该顶点和所有以它为尾的弧。

重复以上步骤,直至全部顶点均一输出,或者当前图中不存在五前驱的顶点为止。拓扑排序要求图示无环图后一种情况 说明该图存在环。

再实现中,我们可以用一个队列存入所有入度为0的顶点。然后依次删除这些顶点,和其对应的边,如果对应边删除后其终点的入度减为0者也将其存入队列中,如此循环下去,知道队列为空。最后比列表中的节点数是否等于图的顶点数,如果不等者图存在一个环。

基于以上的规则可以用下面的代码来实现图的拓扑排序。

 

/**
	 * 图的拓扑排序2,该方法会改变图的结构
	 * @param <T>
	 * @return
	 */
	public static<T> List<T> topologicalSort2(Graph<T> graph){
		Queue<T> vQueue = new LinkedList<T>();
		List<T> vList = new ArrayList<T>();
		Set<T> vSet = graph.vertexSet();
		Set<T> neighbors = null;
		T vertex = null;
		//将入度为0的节点存入队列中
		for(T v : vSet){
			if(graph.getIndegree(v) == 0){
				vQueue.add(v);
				vList.add(v);
			}
		}
		while(!vQueue.isEmpty()){
			vertex = vQueue.poll();
			neighbors = graph.getNeighbors(vertex);
			for(T neighbor : neighbors){
				graph.removeEdge(vertex, neighbor);//删除该边
				if(graph.getIndegree(neighbor) == 0){//若neighbor的入度变为0,者也将其加入队列中
					vQueue.add(neighbor);
					vList.add(neighbor);
				}
			}
		}
		if(vList.size() != graph.numberOfVertices()){
			throw new IllegalStateException("存在环");
		}
		return vList;
	}

 

 方法二:

可以证明在被路径p(v,w)连接的任意顶点所在的图中,对于v和w来说,v在列表中必须出现在w之前。

依据这个结论可以对图的每个节点进行一个dfs的遍历,最终的节点列表就是拓扑排序的一个结果(要对这个列表反转).

 

 

/**
	 * 图的拓扑排序
	 * @param <T>
	 * @param graph
	 * @return
	 */
	public static<T> List<T> topologicalSort(Graph<T> graph){
		List<T> vList = new ArrayList<T>();
		graph.allUnVisted();
		for(T v : graph.vertexSet()){
			if(graph.getState(v) == VertexState.UNVISITED){
				try{
					dfsHandler(graph, v, true, vList);
				}catch (IllegalStateException e) {
					throw new IllegalStateException("图有一个环");
				}
			}
		}
		Collections.reverse(vList);
		return vList;
		
		
	}

 

 测试:

针对下面这个图进行测试



 /**

	 * 测试图的拓扑排序
	 */
	public void testTopologicalSort(){
		List<String> vList = GraphUtil.topologicalSort(graph);
		System.out.println(Arrays.toString(vList.toArray()));
		
		vList = GraphUtil.topologicalSort2(graph);
		System.out.println(Arrays.toString(vList.toArray()));
	}

 Output:

[c2, c5, c1, c3, c7, c6, c4, c8]

[c1, c2, c3, c5, c4, c6, c7, c8]

 


  • 大小: 11.8 KB
分享到:
评论

相关推荐

    基于拓扑排序的排课程序

    山大 数据结构课程设计,基于拓扑排序的排课程序,已有流传,请勿直接引用,否则后果自负。

    基于c语言的有向图的应用程序

    包括建立有向图连接表,计算定点的度,实现拓扑排序等功能,希望大家参考

    Java数据结构和算法中文第二版(1)

    有向图的拓扑排序 有向图的连通性 小结 问题 实验 编程作业 第14章 带权图 带权图的最小生成树 最短路径问题 每一对顶点之间的最短路径问题 效率 难题 小结 问题 实验 编程作业 第15章 应用场合 ...

    ACM图论数据结构常见模板

    拓扑排序 22 最大团 23 LCA 24 倍增 24 基于RMQ(ST表) 26 Tarjan 28 二分图 31 相关总结 31 二分图最大匹配 32 二分图最大权匹配 35 网络流 38 最大流 && 最小割 38 费用流 46 一般数据结构 49 ST Table 49 树状...

    Java数据结构和算法中文第二版(2)

    有向图的拓扑排序 有向图的连通性 小结 问题 实验 编程作业 第14章 带权图 带权图的最小生成树 最短路径问题 每一对顶点之间的最短路径问题 效率 难题 小结 问题 实验 编程作业 第15章 应用场合 ...

    algorithms-java:用Java编写的通用算法

    计算也是DAG的有向图的拓扑顺序的算法解决“所有最短路径问题”的算法排序: Mergesort(多项改进) 快速排序(多项改进) 计算反转次数以有效的方式合并k个排序的数组。堆栈: 将中缀转换为后缀表达式的实现一

    gasstationleetcode-Algorithms-and-Data-Structures:在Java上实现和分析基本算法和数据结构

    加油站 leetcode 算法和数据结构 该存储库用于记录 . 部分内容基于 , 和 。 它将包括三个方面的解决方案 数据结构 算法 时间和空间复杂度 王牌面试 内容 ...拓扑排序 随机的 图形 联合查找 特里 设计

    高级java笔试题-Lookoop:学习笔记

    (python)-拓扑排序,dijkstra,kruskal,Prim greedy algorithms (python)-找零,哈夫曼编码 heap (python) - 二叉堆,斐波那锲堆 List (c) - 列队,简单链表实现 RSA (python) - 基于素数的加密算法 sort (python) ...

    lrucacheleetcode-LeetCode:基于C#和Java的LeetCode解决方案

    lru缓存leetcode 力码 C# 大批 回溯 位操作 广度优先搜索 深度优先搜索 设计 动态规划 图形 贪婪的 哈希表 堆 链表 数学 滑动窗口 种类 堆栈和队列 ...拓扑排序 树 特里 在线评估亚马逊 在线评估 Microsoft

    leetcodepdfpython-DSA_Tech_Drill:技术面试准备之旅-涵盖数据结构和算法、设计和行为以及资源

    BFS,DFS和拓扑排序 2 堆 二分搜索(保存和移动技巧) 按位异或 前 K 个元素 排序算法 K-way合并 前缀总和法 回溯法 单调队列算法 荷兰国旗图案 辅助缓冲法 二分图 连接组件 基于括号的问题 下一个基于大元素的问题 ...

    RecommendationEngine:图工具包和推荐引擎

    推荐引擎 用于 NETS 150 作业分配的图形工具包和推荐引擎。 由宾夕法尼亚大学的学生 Trevin Gandhi、Seth ... 完整列表是:BFS、DFS、拓扑排序、Kosaraju's、Bellman-Ford Single Source Shortest Path、Floyd-

    Jailer:数据库子集和关系数据浏览工具

    Subsetter从关系数据库中导出一致的,参照完整的行集,生成按拓扑排序SQL-DML,DbUnit数据集和层次结构的XML。 通过遵循基于外键或用户定义的关系,数据浏览器允许在数据库中进行双向导航。产品特点从生产性数据库...

    C++数据抽象和问题求解(第6版).[美]Frank M. Carrano(带详细书签).pdf

    20.4.1 拓扑排序 595 20.4.2 生成树 598 20.4.3 最小生成树 600 20.4.4 最短路径 603 20.4.5 回路 606 20.4.6 一些复杂问题 608 第21章 外部存储中的数据处理 615 21.1 了解外部存储 616 21.2 排序外部文件...

    Spark实战.docx

     Spark是一张有向无环图(从一个点出发最终无法回到该点的一个拓扑),并对其进行优化。 4. Spark支持的API Scala、Python、Java等 5. 运行模式  Local (用于测试、开发)  Standlone (独立集群模式)  ...

    CodingQuestion:编码面试题,数据结构库

    拓扑排序 堆栈和优先级队列 特里 联合查找 其他(算法与设计): 位操作 数学 随机的 设计 计划: 数组(两个指针,排序,二进制搜索,滑动窗口),字符串,列表,树(基本树,BST,DFS,BFS,不包括高级树,例如BIT...

    网络听诊管理监控系统.part01

    网络—子网两级网络拓扑结构图显示; 3. 子网、网络设备的工作状态实时监控; 4. 子网、网络设备的属性浏览; 5. 基于规则的子网、网络设备的快速定位; 6. 硬件故障的检测、定位和基本诊断等。   事件分析 1...

Global site tag (gtag.js) - Google Analytics