单源最短路径Dijkstra算法,多源最短路径Floyd算法
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算法的更多相关文章
- 多源最短路径,一文搞懂Floyd算法
前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...
- [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)
1 Floyd算法 1.1 解决问题/提出背景 多源最短路径(带权有向图中,求每一对顶点之间的最短路径) 方案一:弗洛伊德(Floyd算法)算法 算法思想:动态规划法 时间复杂度:O(n^3) 形式上 ...
- 多源最短路径算法—Floyd算法
前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...
- 多源最短路径Floyd算法
多源最短路径是求图中任意两点间的最短路,采用动态规划算法,也称为Floyd算法.将顶点编号为0,1,2...n-1首先定义dis[i][j][k]为顶点 i 到 j 的最短路径,且这条路径只经过最大编 ...
- 最短路径—Dijkstra算法和Floyd算法
原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...
- 最短路径—Dijkstra算法和Floyd算法【转】
本文来自博客园的文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijk ...
- 【转载】最短路径—Dijkstra算法和Floyd算法
注意:以下代码 只是描述思路,没有测试过!! Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始 ...
- 最短路径Dijkstra算法和Floyd算法整理、
转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijks ...
- 【转】最短路径——Dijkstra算法和Floyd算法
[转]最短路径--Dijkstra算法和Floyd算法 标签(空格分隔): 算法 本文是转载,原文在:最短路径-Dijkstra算法和Floyd算法 注意:以下代码 只是描述思路,没有测试过!! Di ...
- 最短路径—大话Dijkstra算法和Floyd算法
Dijkstra算法 算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , ...
随机推荐
- openLDAP安装时无法操作根节点数据,提示的是This base cannot be created with PLA.
1.无法操作根节点数据,提示的是This base cannot be created with PLA. 解决办法 1)添加一个base.ldif文件,里面的dc和配置文件里的保持一致即可 dn: ...
- grpc(二)记一次grpc debug--io.grpc.StatusRuntimeException: UNKNOWN
1.起初是dingding一直报错: instance:服务器名 err:GrpcClient#placeOrder: io.grpc.StatusRuntimeException: UNKNOWN ...
- js获取当前时间:封装js的日期时间
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- IO流的分类
按内容分:字节流和字符流 按流向分:输入流和输出流 字节流: 输入流:InputStream 输出流:OutputStream 字符流: 输入流:FileReader 输出流:FileWriter
- zk 的配额
使用配额,可以统计 zk 某节点下的孩子数量和数据的字节数. 1. 创建节点 create /zhang xx 2.1 为节点设置 子节点 配额 setquota -n 1000 /zhang 2.2 ...
- pycharm import scrapy 报错,No module named 'scrapy'
本地通过下载 pip install scrapy安装成功后,在pychram里面 import scrapy报错 后来在找了各种解决方法,重装wheel,twisted,都不行,最后发现是需要改Pr ...
- fiddler抓取用tomcat来部署的项目接口请求包
Fiddler 是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888. 当Fiddler退出的时候它会自动注销, 这样就不会影响别的程序.关于fiddler这个工具的使 ...
- hibernate操作mysql插入修改中文出现乱码
第一步:mysql的安装目录下配置文件my.ini里面的所有default-character-set改成default-character-set = utf8: 第二部:建立数据库时候字符集选项选
- oracle 导出某用户下的表
exp test/test@orcl owner=test file=E:/all.dmp
- asp.net core mvc HTTP Error 502.5 - Process Failure
HTTP Error 502.5 - Process Failure Common causes of this issue: The application process failed to st ...