`
woxiaoe
  • 浏览: 283695 次
  • 性别: 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
分享到:
评论

相关推荐

    基于拓扑排序的排课程序

    基于拓扑排序的解决方案首先需要构建一个表示课程依赖关系的有向无环图,然后通过拓扑排序生成一个可行的课程顺序。在这个过程中,可能需要用到以下技术: 1. **深度优先搜索(DFS)**或**广度优先搜索(BFS)**:...

    【数据结构】基于紧缩图的邻接表的拓扑排序正文终稿.doc

    本文主要探讨了基于紧缩图的邻接表实现拓扑排序的方法。拓扑排序是一种对有向无环图(DAG,Directed Acyclic Graph)进行线性排序的方法,使得对于图中的每一条有向边uv,都有u出现在排序结果的前面。 紧缩图的邻接...

    43丨拓扑排序:如何确定代码源文件的编译依赖关系?1

    **拓扑排序**是一种对有向无环图(DAG, Directed Acyclic Graph)进行排序的方法,它能够给出所有节点的一种线性序列,使得对于图中的每条边 (u, v),节点u都在节点v之前。在编译场景中,每个源文件被视为图中的一个...

    (C++)基于图数据结构与拓扑序列的任务调度demo.zip

    综上所述,这个压缩包文件的内容涵盖了数据结构中的图和拓扑排序,以及基于这些理论的任务调度。无论你是计算机科学的学生还是专业开发者,理解和掌握这些知识点都是提升编程能力的关键步骤。通过深入学习和实践,你...

    基于Java的LeetCode算法题解.zip

    基于Java的LeetCode算法题解 项目简介 本项目是一个基于Java的LeetCode算法题解集合,涵盖了从简单到复杂的多种算法问题。项目旨在提供详细的算法实现和解题思路,帮助开发者更好地理解和掌握算法知识。 项目的...

    Java实现基于Johnson法则的流水作业调度

    2. **拓扑排序**:应用拓扑排序算法(如Kahn's算法)对作业图进行排序。这需要维护一个入度为零的节点队列,每次取出一个节点,移除与其关联的边,并减少相邻节点的入度。直到所有节点都被处理,得到的顺序即为满足...

    基于Java的源码-JAVA近百种算法大全打包.zip

    - **深度优先搜索(DFS)**: 用于遍历或搜索树或图,可以找出强连通分量、拓扑排序等。 - **广度优先搜索(BFS)**: 适用于寻找最短路径,例如在无权图中找到两点间的最短距离。 - **Dijkstra算法**: 单源最短路径...

    Java基于二叉查找树实现排序功能示例

    同时,二叉查找树也可以用于解决一些复杂的算法问题,例如拓扑排序和最短路径等。 本文提供了一个Java基于二叉查找树实现排序功能的示例,展示了如何使用二叉查找树来实现高效的排序功能。同时,我们也对Java二叉...

    基于java语言的数据结构及算法实现,LeetCode算法示例.zip

    6. 图:图由节点和边组成,用于表示对象之间的复杂关系,如有向图、无向图、加权图和拓扑排序。 二、算法 算法是解决问题或执行任务的精确步骤。以下是常见的算法类型: 1. 排序算法:包括冒泡排序、选择排序、...

    拓扑包

    3. **图算法**:拓扑排序、深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra's、Floyd-Warshall等)都是图算法的典型例子。这些算法在解决实际问题,如路由选择、任务调度、社交网络分析等时非常有用...

    topsort:拓扑排序的实现

    拓扑排序是图论中的一个重要概念,主要用于有向无环图(DAG,Directed Acyclic Graph)的排序问题。在计算机科学中,特别是在数据结构和算法领域,它有着广泛的应用,比如任务调度、依赖关系分析等。本话题将深入...

    java十二种排序算法实现源代码(类)

    12. **二叉树和拓扑结构**:虽然不是具体的排序算法,但它们是数据结构的基础,可以用来优化排序算法,如AVL树和红黑树用于自平衡二叉搜索树,拓扑排序常用于有向无环图(DAG)的排序。 在Java中实现这些排序算法,...

    lintcode的算法、数据结构,基于Java和Python的分析、实现。

    - 图算法:如Dijkstra算法(单源最短路径)、Floyd算法(所有顶点间最短路径)和拓扑排序等。 4. **特定算法实现** - 字符串匹配:如KMP算法、Boyer-Moore算法等,用于在一个字符串中查找另一个字符串。 - 树的...

    java数百种算法实现

    - 拓扑排序:用于有向无环图(DAG)的排序。 4. 动态规划(Dynamic Programming, DP): - 背包问题:0-1背包、完全背包、多重背包等。 - 最长公共子序列(LCS)。 - 矩阵链乘法。 - 背包DP、状态DP等。 5. ...

    java经典算法题

    图论算法在实际应用中广泛,如最短路径问题(Dijkstra算法、Floyd-Warshall算法)、拓扑排序、Prim算法和Kruskal算法用于最小生成树的构建。这些算法在网络设计、物流调度等领域有着重要应用。 动态规划是解决多...

    用蛮力法实现选择排序,冒泡排序程序;用减治法实现插入排序;分治法应用-快排,合并排序,0-1背包问题;Prim算法求最小生成树。伪代码以及java代码实现

    减治法可以用于插入排序、拓扑排序、约瑟夫斯问题、图的深度优先和广度优先查找等问题。在插入排序中,减治法可以通过将数组分解成较小的子数组来实现排序。 插入排序算法描述: Insertion Sort(A[0..n-1]) ∥ ...

    JAVA排序算法

    **定义**: 拓扑排序是对有向无环图的线性排序,每个顶点都表示任务,每条有向边表示任务之间的依赖关系。 **特点**: - **适用性**: 主要用于图的排序问题。 - **时间复杂度**: O(V+E),其中V是顶点数,E是边数。 *...

    道路网络中基于结点的静态聚类算法的实现java

    在本文中,我们将深入探讨如何实现一种基于结点的静态聚类算法,特别是在道路网络的背景下,使用Java编程语言。这种算法是物联网技术中的一个重要应用,它可以有效地处理大量移动对象的聚类问题。 聚类算法的目标是...

    java数据结构

    有向无环图(DAG)常用于表示事件的先后关系,如拓扑排序和关键路径。 查找是指在一个数据集合中查找满足某些条件的数据元素。顺序查找是最简单的一种查找方法,折半查找则是基于有序数组的高效查找方法。查找树如...

    排序案例大全排序案例大全排序案例大全

    6. **拓扑排序(Topological Sort)**:在有向无环图(DAG)中,拓扑排序给出所有节点的一个线性顺序,使得对每条边u-&gt;v,u都出现在v之前。在Java中,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)实现。这种排序常见于...

Global site tag (gtag.js) - Google Analytics