最短路径整理(未完成)

来源:互联网 发布:民生银行软件有问题 编辑:程序博客网 时间:2024/06/11 19:34

最短路径问题(Shortest Path Problem)

问题描述:

        在有向图或者无向图中,如果说从其中的某一点(源点)到另外一点(终点)的路径可能不止一条,而找出的路径权值总和最小的那一条叫做最短路径。

        其中,根据有向图或无向图中各边权取值的情形及问题求解所需,最短路径问题分为以下4种情形,分别用不同的算法求解。

        1).求所有顶点间的最短路(边权值允许为负值,但不存在负权值回路),也就是在最短路径算法中最简单明了的算法------------Floyd算法。

        2).求单源最短路径,边权值允许为负值,但不存在负权值回路--------Bellman-Ford算法。

        3).因Bellman-Ford算法浪费了许多时间做无必要的松弛,可以用SPFA算法进行优化,SPFA算法用的是队列进行的优化,也就是用队列优化的Bellman-Ford算法。 

       4).求单源最短路径(边的权值非负),就是固定一个顶点为源点,求源点到其他每个顶点的最短路径-----Dijkstra算法


弗洛伊德(Floyd)算法(五行最短路)

算法描述:

       Floyd算法是一个经典的动态规划算法。用邻接矩阵的形式来表示,对于一个顶点数是n的图,用n×n的矩阵来表示,其对角线的元素为0,其他元素map[i][j](i≠j)就表示从vi到vj的有向路径长度

       其状态转移方程如下:map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};

       map[i,j]表示i到j的最短距离,k是穷举i,j的断点。

       从节点i到节点j 要么直接到达,要么经过k个断点到达 那么对于每一个k我们只要比较map[i][k]+map[k][j] <map[i][j] 成不成立,如果成立,就map[i][j]=map[i][k]+map[k][j]]。

       时间复杂度为O(n^3)

弗洛伊德(Floyd)算法代码模板:



例题:
http://acm.hdu.edu.cn/showproblem.php?pid=1874

畅通工程续

Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。 

Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。 

Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
 
Sample Input
3 30 1 10 2 31 2 10 23 10 1 11 2
 
Sample Output
2-1

最基础的最短路径算法
代码如下:
©TyxMaek1997-2017



0 0
原创粉丝点击