这里给出的是基于动态规划方法,时间复杂度时O(v^4),可以通过“重复平方”计数使其复杂度降低位O(v^3*lgv).参考《算法导论》25.1
view plaincopy to clipboardprint?
#include <iostream>
using namespace std;
const int N = 5;
const int E = 9;
const int MAX=0xffff;
int g[N][N];
/*
* 这里l1代表“最多包含m-1条边的最短路径矩阵”
* l2作为返回值,代表最多包含m条边的最短路径矩阵。
* 其中l2(i,j) = min {l1(i,j), min {l1(i,k)+g[k][j]}};其中0<=k<=N-1
*/
int ** extend_shortest_path(int **l1)
{
int n = N;
int i=0,j=0;
int ** l2 = new int*[N];
for(i=0;i<n;i++)
l2[i] = new int[N];
int k = 0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
l2[i][j] = MAX;
for(k=0;k<n;k++)
{
int t1 = l2[i][j];
int t2 = l1[i][k] + g[k][j];
if(t1 < t2)
l2[i][j] = t1;
else
l2[i][j] = t2;
}
}
return l2;
}
/*
* 每次迭代由L(m-1)求出L(m),即延伸一条边
* 初始化L1=G=(g[i][j])
* 其中m=0时,如果i==j,l0(i,j) =0;如果i!=j,l0(i,j)=MAX
* 故只需要从m=1开始考虑
*/
int ** slow_all_pairs_shortest_path()
{
int i = 0;
int j = 0;
int ** l1 = new int *[N];
for(i=0;i<N;i++)
l1[i] = new int[N];
for(i=0;i<N;i++)
for(j=0;j<N;j++)
l1[i][j] = g[i][j];
int ** l2;
int m = 2;
for(m=2;m<=N-1;m++)
{
l2 = extend_shortest_path(l1);
for(i=0;i<N;i++)
delete []l1[i];
delete []l1;
l1 = l2;
}
return l1;
}
int main()
{
int i = 0,j=0;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(i==j)
g[i][j] = 0;
else
g[i][j] = MAX;
int c = 0;
while(c<E)
{
cin>>i;
cin>>j;
cin>>g[i][j];
c++;
}
int ** l = slow_all_pairs_shortest_path();
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
cout << l[i][j] << " ";
cout << endl;
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/clearriver/archive/2009/09/13/4547831.aspx
分享到:
相关推荐
Floyd-Warshall算法,又叫Floyd算法,用于求每对顶点之间最短路径
从某个源点到其于各顶点的最短路径,单源点最短路径问题
试设计一个算法,求图中一个源点到其他各顶点的最短路径。 (1)用邻接表表示图; (2)按长度非递减次序打印输出最短路径的长度及相应路径。
基于Java多线程实现所有顶点间最短路径的并行算法
(Java)求两顶点间最短路径和距离 在网上查看了一些博客,发现他们的代码都有些问题,于是自己重新写了一个,有一定注释
用Floyd算法实现求有向图中各顶点之间的最短路径及其长度
求解出从给定顶点到所有顶点的最短路径 判断一个有向图g是否是一棵有向树。(任意一个顶点可能是根实验测试数据基本要求: 第一组数据: dirtree2.grp 第二组数据: grp12.grp 第三组数据: dirtree.grp 第四组数据...
加权图中顶点间最短路径的算法,使用C++实现Floyd算法,对正在学习算法的同学应该挺有帮助的
重点掌握:动态规划法求解每对结点之间的最短路径、0/1背包问题。 如果求任意两点之间的最短路径,两点之间可以直接到达但却不是最短的路径,要让任意两点(例如从顶点a点到顶点b)之间的路程变短,只能引入第三个点...
带权图的多种算法(有向图,无向图,Dijkstra算法,到每个顶点的最短距离,佛洛依德算法(Floyd),找出每对顶点的最短路径,带权重无向图最小生成树,prim算法,Kruskal算法求最小生成树)java实现, 有注释,简单...
利用Dijkstra算法来求解顶点之间最短路径
数据结构 能求有向图 从任何一个顶点出发都行 求最短路径
如程序中那样,定义一个数组p[N],其中p[i]代表“起始点v到顶点i的最短路径中,除i本身的最后一个顶点”,即着这条路径上i的前驱顶点,这个顶点随着“更多顶点的最短路径被求出”这个过程而变化。 当求出v到所有...
严蔚敏数据结构教材中关于最短路径求解的C代码实现
Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。
单源点最短路径问题解决的是既定起点的情况下,寻求该点到图中其它顶点的最短路径。请用C/C++语言的结构体、指针、数据结构等基础知识,编写程序实现图的结构定义、图的存储,以及求解单源点最短路径。
def Dijkstra(network,s,d):#迪杰斯特拉算法算s-d的最短路径,并返回该路径和代价 print(Start Dijstra Path……) path=[]#s-d的最短路径 n=len(network)#邻接矩阵维度,即节点个数 fmax=999 w=[[0 for i in ...
武汉理工顶点间的最短路径课程设计报告,其中包含了完整的源码
【问题描述】 试设计一个算法,求图中一个源点到其他各顶点的最短路径。 【基本要求】 (1)用邻接表表示图; (2)按长度非递减次序打印输出最短路径的长度及相应路径。
给定一个带权有向图 G=(V,E) ,其中每条边的权是一个整数。另外,还给定 V 中的一个顶点,...现在我们要计算从源到所有其他各顶点的最短路径长度。这里的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。