-- 图论写到这,基本概念也就告一段落了,之后还会贴一些我在工作中设计的图
-- 图论一 http://blackproof.iteye.com/blog/1727050
-- 图论二 http://blackproof.iteye.com/blog/1731542
-- 图论二 http://blackproof.iteye.com/blog/1731557
-- 图论三 http://blackproof.iteye.com/blog/1732941
-- 感谢网上资料,感谢java数据结构和算法这本书。
求带权图的最短路径,经典算法是dijkstra算法
算法不仅可以求一个顶点到令一个顶点的最短路径,而且可以列出到所有节点的最短路径
算法思路
算法用一个数据存储当前所知道的最短路径spath[],
还用一个数据去存储已经遍历的节点V
遍历所有节点,将遍历的节点放入V,将起点到其他节点的权值放入spath[]中,并重复些列操作:
1.遍历的当前节点为currentVertex,取得spath[]中最小边,并将此边的终点作为当前节点
2.遍历当前节点到其他边的距离,并且用起点->当前顶点->其他没在V的顶点的值 和 spath[]中到对应终点的边做比较,当前者小,替代后者到spath中
当完成遍历后,spath中放置的就是从顶点到各个顶点的最短路径
代码如下:
Graph:
package com.Construction.DiscrectGraph.Dijkstra; public class Graph { private final int MAX_VERTS = 20; private final int INFINITY = 1000000; private Vertex vertexList[]; private int adjMat[][]; private int nVerts; private int nTree; private DistPar sPath[]; private int currentVert; private int startToCurrent; public Graph(){ vertexList = new Vertex[MAX_VERTS]; adjMat = new int[MAX_VERTS][MAX_VERTS]; nVerts = 0; nTree = 0; for (int i = 0; i < MAX_VERTS; i++) { for (int j = 0; j < MAX_VERTS; j++) { adjMat[i][j] = INFINITY; } } sPath = new DistPar[MAX_VERTS]; } public void addVertex(char lab){ vertexList[nVerts++] = new Vertex(lab); } public void addEdge(int start,int end,int weight){ adjMat[start][end] = weight; } public void path(){ int startTree = 0; vertexList[startTree].isInTree = true; nTree = 1; for (int i = 0; i < nVerts; i++) { int tempDist = adjMat[startTree][i]; sPath[i] = new DistPar(startTree, tempDist); } while(nTree < nVerts){ int indexMin = getMin(); int minDist = sPath[indexMin].distance; if(minDist == INFINITY){ System.out.println("There are unreachable vertices"); break; } else{ currentVert = indexMin; startToCurrent = sPath[indexMin].distance; } vertexList[currentVert].isInTree = true; nTree++; adjust_sPath(); } displayPaths(); nTree = 0; for (int i = 0; i < nVerts; i++) { vertexList[i].isInTree = false; } } public int getMin(){ int minDist = INFINITY; int indexMin = 0; for (int i = 0; i < nVerts; i++) { if(!vertexList[i].isInTree && sPath[i].distance < minDist){ minDist = sPath[i].distance; indexMin = i; } } return indexMin; } public void adjust_sPath(){ int column = 1; while(column < nVerts){ if(vertexList[column].isInTree){ column++; continue; } int currentToFringe = adjMat[currentVert][column]; int startToFringe = startToCurrent + currentToFringe; int sPathDist = sPath[column].distance; if(startToFringe < sPathDist){ sPath[column].parentVert = currentVert; sPath[column].distance = startToFringe; } column++; } } public void displayPaths(){ for (int i = 0; i < nVerts; i++) { System.out.println(vertexList[i].label + " = "); if(sPath[i].distance == INFINITY) System.out.println("int"); else System.out.println(sPath[i].distance); char parent = vertexList[sPath[i].parentVert].label; System.out.println("("+parent+")"); } System.out.println(); } public static void main(String[] args) { Graph theGraph = new Graph(); theGraph.addVertex('A'); theGraph.addVertex('B'); theGraph.addVertex('C'); theGraph.addVertex('D'); theGraph.addVertex('E'); theGraph.addEdge(0, 1, 50); theGraph.addEdge(0, 3, 80); theGraph.addEdge(1, 2, 60); theGraph.addEdge(1, 3, 90); theGraph.addEdge(2, 4, 40); theGraph.addEdge(3, 2, 20); theGraph.addEdge(3, 4, 70); theGraph.addEdge(4, 1, 50); System.out.println("shortest paths"); theGraph.path(); System.out.println(); } }
算法中的spath中的对象:
package com.Construction.DiscrectGraph.Dijkstra;
public class DistPar { public int distance; public int parentVert; public DistPar(int pv,int d){ distance = d; parentVert = pv; } }
节点:
package com.Construction.DiscrectGraph.Dijkstra; public class Vertex { public char label; public boolean isInTree; public Vertex(char lab){ label = lab; isInTree = false; } }
感谢:http://2728green-rock.blog.163.com/blog/static/43636790200901211848284/
相关推荐
最短路径算法Dijkstra是图论中的一个经典算法,由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出。该算法主要用于寻找带权重的有向或无向图中,从一个特定顶点到其他所有顶点的最短路径。Dijkstra算法的核心思想是...
**Dijkstra算法详解** ...总结来说,Dijkstra算法是解决图论中最短路径问题的利器,通过贪心策略逐步找到从起点到各个节点的最短路径。理解并熟练掌握Dijkstra算法对于理解和解决实际问题至关重要。
最短路径问题是在图论领域中的一个基本问题,它要求找到在加权图中两个指定节点之间的权值和最小的路径。Dijkstra算法是解决这一问题的经典算法,由荷兰计算机科学家艾兹赫尔·戴克斯特拉(Edsger W. Dijkstra)于...
总的来说,"dongtaiguihua.rar"提供的MATLAB程序是动态规划应用于解决带权最短路径问题的一个实例,它展示了如何在实际问题中运用这一强大的工具。通过学习和理解这个程序,我们可以更好地掌握动态规划的精髓,以及...
【单源最短路径】是图论中的一个重要概念,它是指在给定的带权有向图中,从一个特定的源节点出发,找到到达所有其他节点的最短路径。这个概念广泛应用于计算机科学和算法设计,特别是在网络路由、物流规划、社交网络...
最短路径问题可以被定义为:在带权无向图或有向图中寻找两个特定节点间路径的最小代价。在这个硅谷城镇地图问题中,我们可以假设图是有向的,因为通常交通网络都是单向的。权值可能代表距离、行驶时间或者其它相关的...
在本文中,我们使用Dijkstra算法来求图中一个源点到其他各顶点的最短路径。 知识点4:算法设计 我们的算法设计包括四个步骤: 1. 需求分析:确定问题的需求和约束条件。 2. 设计思想:使用链表存储图的邻接信息,...
Dijkstra算法是一种常用的单源最短路径算法,用于解决带权有向图中的最短路径问题。 单源最短路径问题 单源最短路径问题是指从给定的源顶点s到其它顶点v的权最小路径。该问题可以形式化地描述为:给定一个带权有向...
在带权图中,求最短路径问题的算法有很多,如狄克斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法等。狄克斯特拉算法是解决图的最短路径问题的一种常用算法,它可以解决从图中的一个顶点到其余每一个顶点的最短路径...
2. **Floyd-Warshall算法**:这是一个解决所有对最短路径问题的动态规划方法,适合处理带权的有向图或无向图。Floyd-Warshall算法通过逐步更新所有节点对之间的最短路径,最终得到完整的最短路径矩阵。C#实现时,...
* 可以解决带权有向图中的最短路径问题 * 可以应用于解决实际中的各种最短路径问题 Dijkstra算法的缺点是: * 不适用于解决带负权值的图 * 不适用于解决有负权值的最短路径问题 * 时间复杂度较高,需要进行多次...
在图论与计算机科学领域,寻找从一个源点到图中其他所有顶点的最短路径问题被广泛研究,这种问题通常被称为“单源最短路径问题”。这类问题在实际应用中具有重要意义,例如在交通规划、网络路由选择等领域都有广泛的...
2. **Dijkstra算法**:由荷兰计算机科学家Edsger Dijkstra提出,主要用于解决带权有向图或无向图的单源最短路径问题。Dijkstra算法使用贪心策略,每次选取当前未访问节点中距离源点最近的一个加入到已访问集合,并...
在图论和计算机科学中,K-最短路径(K-Shortest Paths,KSP)是一种寻找网络中从源节点到目标节点多条最短路径的算法。它扩展了单源最短路径问题,不仅找出一条最短路径,而是找到前k条最短路径。这些路径对于优化...
在IT领域,尤其是在图论和算法设计中,"带权无向网求最短路径"是一个重要的主题。这个任务涉及到如何在没有方向的网络中,从一个特定的起点找到到达所有其他点的最短路径。这通常应用于各种场景,如交通路线规划、...
Dijkstra算法是一种解决单源最短路径问题的著名算法,它被广泛应用于路由选择、图论和网络优化等领域。 实验的目的是使学生理解和掌握最短路径路由算法的基本原理,并能用一种编程语言实现该算法。实验要求包括: ...
这三个算法分别用于求解图中的最小生成树问题和最短路径问题。 ### Prim算法详解 #### 算法背景及原理 Prim算法是一种用于寻找加权无向图中的最小生成树(Minimum Spanning Tree, MST)的算法。最小生成树是指在一...
迪杰斯特拉(Dijkstra)算法是图论中一种经典的最短路径算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。这个算法主要用于寻找带权有向图或无向图中从源节点到其余所有节点的最短路径。在给定的描述中,...
Floyd算法则是一种基于动态规划思想的算法,可以求解任意两点之间的最短路径,包括但不限于带权有向图或无向图。该算法不仅可以找到图中每对顶点的最短路径,还可以构建出最短路径树。Floyd算法的工作原理是通过不断...