`
eriol
  • 浏览: 409134 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一些和图论有关的算法

阅读更多

1. 拓扑排序

 

算法:首先对每个顶点计算它的入度。然后,将所有入度为0的顶点放到一个初始为空的队列(或栈)中。当队列不空时,删除一个顶点v,并将与v邻接的所有顶点的入度均减1。只要一个顶点的入度降为0,就把该顶点放入队列中。此时,拓扑排序就是顶点出队的顺序。使用邻接表的情况下,该算法时间复杂度为O(|E|+|V|)。

public void topsort() throws CycleFoundException {
	Queue<Vertex> q = new Queue<Vertex>();
	int counter = 0;
		
	for each Vertex v
		if (v.indegree == 0)
			q.enqueue(v);
		
	while (!q.isEmpty()) {
		Vertex v = q.dequeue();
		v.topNum = ++counter;
		
		for each Vertex w adjacent to v
			if (--w.indegree == 0) 
				q.enqueue(w);
	}
	
	if (counter != NUM_VERTICES)
		throw new CycleFoundException();
}

 

 

2. 无权最短路径

算法:首先,将开始顶点放入队列中,距离为0。当队列不空时,删除一个顶点v,检查与v邻接的所有顶点w,如果w的距离是INFINITY,那么w的距离加1,路径设为v,并将w放入队列中。使用邻接表的情况下,该算法时间复杂度为O(|E|+|V|)。

public void unweighted(Vertex s) {
	Queue<Vertex> q = new Queue<Vertex>();
	
	for each Vertex v
		v.dist = INFINITY;
	
	s.dist = 0;
	q.enqueue(s);
	
	while (!q.isEmpty()) {
		Vertex v = q.dequeue();
		
		for each Vertex w adjacent to v
			if (w.dist == INFINITY) {
				w.dist = v.dist + 1;
				w.path = v;
				q.enqueue(w);
			}
	}
}

 

 

3. 赋权最短路径

算法:使用Dijkstra算法。在所有unknown顶中选择具有最小dv的顶点v,将其设为known。对于所有与v邻接的顶点,如果dv+cv,wdw小,则更新dwdv+cv,w。该算法的时间复杂度为O(|V|2)。如果图是稠密的,该算法是最优的。如果图是稀疏的,可将距离存储在优先队列中,这样复杂度为O(|E|log|V|)。

public void dijkstra(Vertex s) {
	for each Vertex v {
		v.dist = INFINITY;
		v.known = false;
	}
	
	s.dist = 0;
	
	for (; ;) {
		Vertex v = smallest unknown distance vertex;
		if (v == NOT_A_VERTEX)
			break;
		v.known = true;
		
		for each Vertex w adjacent to v
			if (!w.known) {
				if (v.dist + cvm < w.dist) {
					// update w
					decrease(w.dist to v.dist + cvm);
					w.path = v;
				}
			}
	}
}
	
public void printPath(Vertex v) {
	if (v.path != null) {
		printPath(v.path);
		System.out.print(" to ");
	}
	System.out.print(v);
}
 

 

4. 具有负边值的图

负边权最短路径:首先,将s放到队列中。然后,在每一个阶段让一个顶点v出队。找到所有与v邻接的顶点w,使得ddv+cv,w。然后更新dw和路径,并在w不在队列中的时候把它放到队列中。可以为每个顶点设置一个比特位以指示它在队列中出现的情况。重复该过程直到队列为空。该算法复杂度为O(|E|*|V|)。

 

public void weightedNegative(Vertex s) {
	Queue<Vertex> q = new Queue<Vertex>();
	
	for each Vertex v
		v.dist = INFINITY;
	
	s.dist = 0;
	q.enqueue(s);
	
	while (!q.isEmpty()) {
		Vertex v = q.dequeue();
		
		for each Vertex w adjacent to v
			if (v.dist + cvw < w.dist) {
				// update w
				w.dist = v.dist + cvw;
				w.path = v;
				if (w is not already in q)
					q.enqueue(w);
			}
	}
}

 

 

 

5. 无圈图最短路径

算法:使用拓扑顺序选择顶点来改进Dijkstra算法。由于选择和更新可以在拓扑排序的时候进行,因此算法能够一趟完成。因为当一个顶点v被选取之后,按照拓扑排序的法则它没有从unknown顶点发出的进入边,因此它的距离dv不会再被降低。使用这种算法,不需要优先队列,时间复杂度为O(|E|+|V|)。

 

public void weightedNegative(Vertex s) {
	Queue<Vertex> q = new Queue<Vertex>();
	
	for each Vertex v {
		v.dist = INFINITY;
		if (v.indegree == 0) {
			v.dist = 0;
			q.enqueue(v);		
		}		
	}	
	
	while (!q.isEmpty()) {
		Vertex v = q.dequeue();
		
		for each Vertex w adjacent to v {
			if (v.dist + cvw < w.dist) {
				w.dist = v.dist + cvw;
				w.path = v;
			}
			if (--w.indegree == 0)
				q.enqueue(w);
		}
	}		
}
0
1
分享到:
评论

相关推荐

    图论算法软件 图论算法软件

    图论是计算机科学中的一个重要分支,它...总之,图论算法软件是一个强大的学习工具,能够帮助用户从理论到实践全方位掌握图论算法,对于计算机科学、数据科学以及相关领域的学习者来说,这将是一个非常有价值的资源。

    图论及其算法课件

    图论算法在计算机科学中扮演着很重要的角色,它提供了对很多问题都有效的一种简单而系统的建模方式。很多问题都可以转化为图论问题,然后用图论的基本算法加以解决。遗传算法是解优化问题的有效算法,而并行遗传算法...

    图论及其算法 初学必备

    此外,你还可以期待书中涵盖其他一些重要主题,比如图的染色问题、图的匹配理论、平面图、图的矩阵表示(如邻接矩阵和邻接表),以及图论在图数据库、社交网络分析、网络路由等领域中的应用。 总的来说,"图论及其...

    图论算法算法总结.pdf

    不过,通过现有信息,我们可以大致了解一些基础的图论算法的应用和实现原理。在实际操作中,根据具体问题场景选择合适的算法至关重要,同时算法的实现还需要考虑数据结构的设计、时间复杂度以及空间复杂度等实际因素...

    图论的算法与程序设计.pdf

    图论的算法与程序设计 图论的算法与程序设计 图论的算法与程序设计 图论的算法与程序设计 图论的算法与程序设计

    图论的算法与程序设计

    4. 深度优先搜索(DFS)和广度优先搜索(BFS):两种基本的图遍历算法,适用于解决许多图相关的问题,如判断连通性、找出所有可能的路径等。 5. 匹配问题:匈牙利算法解决二分匹配问题,对于网络流问题有着重要的...

    图论常用算法选编10100841

    在本资源“图论常用算法选编10100841”中,我们将会探讨一些核心的图论算法及其应用。这些算法对于解决网络流、最短路径、最小生成树、匹配问题等具有广泛的实际意义。 1. **深度优先搜索(DFS)与广度优先搜索(BFS)*...

    图论算法及其MATLAB实现(完整版)

    《图论算法及其MATLAB实现》是一本深入探讨图论算法与其实现的书籍,尤其强调了使用MATLAB这一强大的...无论你是计算机科学的学生,还是在相关领域工作的专业人士,都将从这本《图论算法及其MATLAB实现》中受益匪浅。

    图论常用算法-----算法

    以上就是图论中的一些基础算法,它们在实际问题中有着广泛的应用,如路由选择、任务调度、电路设计等。通过理解并掌握这些算法,可以有效地解决复杂网络系统中的诸多挑战。在《图论常用算法选编_10100841》这个文档...

    图论算法理论实现_图论及其_图论算法_图论_图论知识_

    图论是数学的一个分支,主要研究点(顶点)与线(边)组成的结构,它在计算机科学中有着广泛的应用,特别是在...《图论算法理论实现及其应用》这本书无疑是一份宝贵的资源,它将帮助读者深入理解这一领域的核心内容。

    图论的算法与程序设计教程 PDG

    图论是计算机科学中一个...总的来说,《图论的算法与程序设计教程 PDG》会深入讲解这些核心概念,并通过实例和练习帮助读者熟练掌握图论算法的实现。对于想要提升算法能力的程序员来说,这是一份不可多得的学习资料。

    图论算法理论、实现及应用 高清带书签pdf

    ### 图论算法理论、实现及应用 #### 一、图论概述 图论作为数学的一个重要分支,主要研究由...此外,对于从事软件开发的专业人士来说,本书也是一个非常有价值的参考资料,可以帮助他们更深入地理解和应用图论算法。

    图论算法和C++实现

    根据提供的标题、描述、标签及部分内容,我们可以提炼出与图论算法相关的几个核心知识点:Dijkstra算法、Floyd-Warshall算法以及Prim算法,并重点分析它们的原理与C++实现方式。 ### Dijkstra算法 Dijkstra算法是...

    图论相关算法matlab源程序代码

    图论是计算机科学中的一个重要...总的来说,这个压缩包提供了丰富的图论算法实现,对于学习和实践MATLAB编程,以及深入理解图论概念非常有益。通过研究这些源码,不仅可以提升编程技能,还能深化对图论算法原理的理解。

    并行图论算法,并行图论算法

    随着计算硬件的发展,尤其是多核处理器和分布式集群的普及,并行图论算法成为了优化计算性能的关键技术。本文将深入探讨并行图论算法的核心概念、常用算法以及其在实际应用中的价值。 一、并行计算基础 并行计算是...

    图论算法软件.rar

    本压缩包“图论算法软件.rar”很可能包含了一些用于分析和解决图论问题的软件工具或源代码。下面我们将详细探讨图论及其相关算法。 1. 图的基本概念: 图是由顶点(节点)和边(连接顶点的线)构成的数据结构。它...

    图论经典算法

    经典 图论 算法

    图论的一些算法——c语言、c++

    ### 图论中的经典算法及其C/C++实现 #### 引言 本文主要介绍几种图论中的经典算法,并...以上介绍了几种常用的图论算法及其C/C++实现,这些算法在实际应用中非常有用,能够帮助我们高效地解决各种与图相关的计算问题。

Global site tag (gtag.js) - Google Analytics