栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

最短路径问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

最短路径问题

“G港”是个物流集散中心,经常需要往各个城市运东西,怎么运送距离最近?

——单源最短路径问题

各个城市之间也需要互相往来,相互之间怎么走距离最近?

——每对顶点间的最短路径

BFS算法

 

注:无权图可以视为一种特殊的带权图,只是每条边的权值都为1

就是对BFS的小修改,在visit一个顶点时,修改

其最短路径长度d[]并在path[]记录前驱结点

BFS算法求最短路径只适用于无权图或所有边权值都相同的图

//求顶点U到其他顶点的最短路径
void BFS_MIN_Distance(Graph G,int u){
    //d[i]表示从u到i结点的最短路径
    for(i = 0;i=0;w=NextNeighbor(G,u,w)){
            //检测v所有邻接点
            if(!visited[w]){            //w为v的尚未访问的邻接点
                d[w] = d[u]+1;          //路径长度加1
                path[w] = u;            //最短路径应从u到w
                visited[w] = true;      //对w做已访问标记
                EnQueue(Q,w);           //顶点w入队列
            }
        }
    }
}

Dijkstra算法

V0到V2的最短(带权)路径长度为:dist[2] = 9

通过path[]可知,V0到V2的最短(带权)路径为:V2<——V1<——V4<——V0

时间复杂度:O(|푉|2)

Dijkstra算法不适用于有负权值的带权图

 

Flotd算法

Floyd算法:求出每一对顶点之间的最短路径

使用动态规划思想,将问题的求解分为多个阶段

对于n个顶点的图G,求任意一对顶点Vi->Vj之间的最短路径可分为如下几个阶段:

#初始:不允许在其他顶点中转,最短路径是?

#0:若允许在V0中转,最短路径是?

#1:若允许在V0、V1中转,最短路径是?

#2:若允许在V0、V1、V2中转,最短路径是?

…

#n-1:若允许在V0、V1、V2……Vn-1中转,最短路径是?

时间复杂度:O(|푉|3)

空间复杂度:O(|푉|2)

Floyd算法不能解决带有“负权回路”的图(有负权值的边组成回路),这种图可能没有最短路径

注:也可用Dijkstra算法求所有顶点间的最短路径,重复|V|次即可,总的时间复杂度为:O(|푉|3)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/950159.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号