1.单源最短路径

(1)无权图的单源最短路径

 /*无权单源最短路径*/
void UnWeighted(LGraph Graph, Vertex S)
{
std::queue<Vertex> Q;
Vertex V;
PtrToAdjVNode W;
Q.push(S);
while (!Q.empty())
{
V = Q.front();
Q.pop();
for (W = Graph->G[V].FirstEdge; W; W = W->Next)
if (dist[W->AdjV] != -)
{
dist[W->AdjV] += dist[V] + ;
path[W->AdjV] = V;
Q.push(W->AdjV);
} } }

函数:返回还未被收录顶点中dist最小者

 Vertex FindMinDist(MGraph Graph, int dist[], int collected[])
{
/*返回未被收录顶点中dist最小者*/
Vertex MinV, V;
int MinDist = INFINITY; for (V = ; V < Graph->Nv; ++V)
{
if (collected[V] == false && dist[V] < MinDist)
{
MinDist = dist[V];
MinV = V; //更新对应顶点
}
}
if (MinDist < INFINITY) //若找到最小值
return MinV;
else
return -;
}
(2)有权图的单源最短路径
单源最短路径Dijkstra算法
 /*单源最短路径Dijkstra算法*/
/*dist数组存储起点到这个顶点的最小路径长度*/
bool Dijkstra(MGraph Graph, int dist[], int path[], Vertex S)
{
int collected[MaxVertexNum];
Vertex V, W; /*初始化,此处默认邻接矩阵中不存在的边用INFINITY表示*/
for (V = ; V < Graph->Nv; V++)
{
dist[V] = Graph->G[S][V]; //用S顶点对应的行向量分别初始化dist数组
if (dist[V] < INFINITY) //如果(S, V)这条边存在
path[V] = S; //将V顶点的父节点初始化为S
else
path[V] = -; //否则初始化为-1
collected[V] = false; //false表示这个顶点还未被收入集合
} /*现将起点S收录集合*/
dist[S] = ; //S到S的路径长度为0
collected[S] = true; while ()
{
V = FindMinDist(Graph, dist, collected); //V=未被收录顶点中dist最小者
if (V == -) //如果这样的V不存在
break;
collected[V] = true; //将V收录进集合
for (W = ; W < Graph->Nv; W++) //对V的每个邻接点
{
/*如果W是V的邻接点且未被收录*/
if (collected[W] == false && Graph->G[V][W] < INFINITY)
{
if (Graph->G[V][W] < ) //若有负边,不能正常解决,返回错误标记
return false ;
if (dist[W] > dist[V] + Graph->G[V][W])
{
dist[W] = dist[V] + Graph->G[V][W]; //更新dist[W]
path[W] = V; //更新S到W的路径
}
}
}
}
return true;
}

2.多源最短路径Floyd算法

 /*多源最短路径*/
bool Floyd(MGraph Graph, WeightType D[][MaxVertexNum], Vertex path[][MaxVertexNum])
{
Vertex i, j, k; /*初始化*/
for (i = ; i < Graph->Nv; i++)
for (j = ; j < Graph->Nv; j++)
{
D[i][j] = Graph->G[i][j];
path[i][j] = -;
} for (k = ; k < Graph->Nv; k++)
for (i = ; i < Graph->Nv; i++)
for (j = ; j < Graph->Nv; j++)
{
if (D[i][k] + D[k][j] < D[i][j])
D[i][j] = D[i][k] + D[k][j];
if (i == j && D[i][j] < ) //若发现负值圈,不能正常解决,返回错误标记
return false;
path[i][j] = k;
}
return true; //算法执行完毕,返回正确标记
}

单源最短路径Dijkstra算法,多源最短路径Floyd算法的更多相关文章

  1. 多源最短路径,一文搞懂Floyd算法

    前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...

  2. [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)

    1 Floyd算法 1.1 解决问题/提出背景 多源最短路径(带权有向图中,求每一对顶点之间的最短路径) 方案一:弗洛伊德(Floyd算法)算法 算法思想:动态规划法 时间复杂度:O(n^3) 形式上 ...

  3. 多源最短路径算法—Floyd算法

    前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...

  4. 多源最短路径Floyd算法

    多源最短路径是求图中任意两点间的最短路,采用动态规划算法,也称为Floyd算法.将顶点编号为0,1,2...n-1首先定义dis[i][j][k]为顶点 i 到 j 的最短路径,且这条路径只经过最大编 ...

  5. 最短路径—Dijkstra算法和Floyd算法

    原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...

  6. 最短路径—Dijkstra算法和Floyd算法【转】

    本文来自博客园的文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijk ...

  7. 【转载】最短路径—Dijkstra算法和Floyd算法

    注意:以下代码 只是描述思路,没有测试过!! Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始 ...

  8. 最短路径Dijkstra算法和Floyd算法整理、

    转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijks ...

  9. 【转】最短路径——Dijkstra算法和Floyd算法

    [转]最短路径--Dijkstra算法和Floyd算法 标签(空格分隔): 算法 本文是转载,原文在:最短路径-Dijkstra算法和Floyd算法 注意:以下代码 只是描述思路,没有测试过!! Di ...

  10. 最短路径—大话Dijkstra算法和Floyd算法

    Dijkstra算法 算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , ...

随机推荐

  1. 无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据

    背景 在做接口自动化的过程中,接口返回的数据是  列表字典循环嵌套  格式的,所以怎样通过一个key值,获取到被包裹了多层的目标数据成为了摆在我面前的一个问题. 一开始没想自己写,但是搜索后发现虽然很 ...

  2. C#集合类型大揭秘

    集合是.NET FCL(Framework Class Library)的重要组成部分,我们平常撸C#代码时免不了和集合打交道,FCL提供了丰富易用的集合类型,给我们撸码提供了极大的便利.正是因为这种 ...

  3. 『Python CoolBook』C扩展库_其六_线程

    GIL操作 想让C扩展代码和Python解释器中的其他进程一起正确的执行, 那么你就需要去释放并重新获取全局解释器锁(GIL). 在Python接口封装中去释放并重新获取全局解释器锁(GIL),此时本 ...

  4. React Native 开发日常、常见问题总结及解决

    优点: 1.写 UI 快,跟写 HTML 差不多,flex 布局写起来很爽,而且跨平台: 2.调试方便,command + R 直接刷新 Simulator,不用像 Xcode 等待编译: 3.体验好 ...

  5. 转载 [c#] 虚函数(Virtual),抽象函数(abstract)和接口的区别

    1.virtual:允许被重写,但不强制要求.声明时提供其自身实现: 2.abstract:强制要求其继承者重写.声明时不提供其自身的实现,抽象类不能被实例化: 3.interface:接口就是协议, ...

  6. linux如何让一个程序崩溃后自动重启

    思路:  写一个脚本 监控程序的运行状态  没有运行启动运行 已运行不做操作. 如果在控制台启动脚本 注意必须  nohup sh xxx.sh & while true do ps -ef ...

  7. webpack配置接口路径

    比如在webpack.config.js中的plugins中加入 new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(' ...

  8. Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

    Android 设备的CPU类型(通常称为”ABIs”) 引用: https://blog.csdn.net/ouyang_peng/article/details/51168072 armeabiv ...

  9. Backpack VI

    Given an integer array nums with all positive numbers and no duplicates, find the number of possible ...

  10. SpringBoot(四)thymeleaf+MyBatis+MySql

    接着上一节 1.第一步:在pom文件中添加 <!-- MyBatis --> <dependency> <groupId>org.mybatis.spring.bo ...