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. DAY11 函数(二)

    一.函数的对象 1.1定义:函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象 1.2函数对象的应用 1 可以直接被引用 fn = cp_fn def fn(): ...

  2. vue-先渲染dom载执行js

    价格判断v-if=“dataList”有数据的时候才渲染

  3. B站(Bilibili) 视频的下载。

    1) 第一种是众所周知的方法,在URL的 bilibili 前加个 i, 就可以有视频的mp4的地址,然后用下载器下载. 比如 想 下载 https://www.bilibili.com/video/ ...

  4. [Oracle11g] 通过伪列查询

    oracle中的伪列默认第一行是1,所以可以选择<=rownum的方法选取,但是>是无法选取的.这时候需要固化伪列. 固化前可以这样查询:select * from  表名 where r ...

  5. [easyUI] datagrid 数据格 可以进行分页

    1. 新建一个GridNode的类: public class GridNode { private Long id; private String title;//投票标题 private Inte ...

  6. WPF InkCanvas 书写毛笔效果

    https://www.cnblogs.com/younShieh/p/10602787.html

  7. HSV色彩空间和颜色分量范围

    部分来自: https://wenku.baidu.com/view/eb2d600dbb68a98271fefadc.html http://blog.csdn.net/Taily_Duan/art ...

  8. loj#2059. 「TJOI / HEOI2016」字符串 sam+线段树合并+倍增

    题意:给你一个子串,m次询问,每次给你abcd,问你子串sa-b的所有子串和子串sc-d的最长公共前缀是多长 题解:首先要求两个子串的最长公共前缀就是把反过来插入变成最长公共后缀,两个节点在paren ...

  9. Lua 语言环境安装

    Linux 系统上安装(本文使用了5..0版本进行安装:) curl -R -O http://www.lua.org/ftp/lua-.tar.gz tar zxf lua-.tar.gz cd l ...

  10. 从rnn到lstm,再到seq2seq(二)

    从图上可以看出来,decode的过程其实都是从encode的最后一个隐层开始的,如果encode输入过长的话,会丢失很多信息,所以设计了attation机制. attation机制的decode的过程 ...