图论算法总结(三)

本文介绍了三种最短路径算法。Floyed - Warshall算法时间复杂度为O(N3),可求出任两点间最短路;Dijkstra算法时间复杂度为O(N2),不能处理负边权;Bellman - Ford算法时间复杂度为O(NE)。强调理解算法思路并学以致用,选用最短时间的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最短路径算法
一)Floyed-Warshall算法 时间:O(N3)
初始化:点u、v如果有边相连,则dis[u][v]=w[u][v]。
 如果不相连则dis[u][v]=0x7fffffff
For (k = 1; k <= n; k++)
For (i = 1; i <= n; i++)
For (j = 1; j <= n; j++)
If (dis[i][j] >dis[i][k] + dis[k][j])
dis[i][j] = dis[i][k] + dis[k][j];
算法结束:dis[i][j]得出的就是从i到j的最短路径。
用Floyed求出任两点间的最短路,然后求出每个点到所有可达的点的最大距离,记做mdis[i]。(Floyed算法)
r1=max(mdis[i])
  然后枚举不连通的两点i,j,把他们连通,则新的直径是mdis[i]+mdis[j]+(i,j)间的距离。
  r2=min(mdis[i]+mdis[j]+dis[i,j])
  re=max(r1,r2)
  re就是所求。
二)Dijkstra算法 时间:O (N2)
ps::不能处理存在负边权
初始化:dis[v]=∞(v≠s); dis[s]=0; pre[s]=0;
For (i = 1; i <= n ; i++)
1.在没有被访问过的点中找一个顶点u使得dis[u]是最小的。
2.u标记为已确定最短路径
3.For 与u相连的每个未确定最短路径的顶点v
if (dis[u]+w[u][v] < dis[v])
{
dis[v] = dis[u] + w[u][v];
pre[v] = u;
}
三)Bellman-Ford算法 时间:O(NE)
O(NE),N是顶点数,E是边数。
设s为起点,dis[v]即为s到v的最短距离,pre[v]为v前驱。w[j]是边j的长度,且j连接u、v。
初始化:dis[s]=0,dis[v]=∞(v≠s),pre[s]=0
For (i = 1; i <= n-1; i++)
For (j = 1; j <= E; j++) //注意要枚举所有边,不能枚举点。
if (dis[u]+w[j]<dis[v])   //u、v分别是这条边连接的两个点。
{
dis[v] =dis[u] + w[j];
pre[v] = u;
}

对于求最短路径的方法,理解算法的思路选用最短时间,无疑是最根本的方法,学会套用算法,理解是一方面,用又是一方面学以致用才行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值