迪杰斯特拉(Dijkstra)算法

# include <stdio.h> # define MAX_VERTEXES //最大顶点数
# define INFINITY ;//代表∞ typedef struct
{/* 无向图结构体 */
int vexs[MAX_VERTEXES];//顶点下标
int arc[MAX_VERTEXES][MAX_VERTEXES];//矩阵
int numVertexes, numEdges;//顶点数和边数 }MGraph; typedef int PathArc[MAX_VERTEXES];//存储最短路径的下表数组
typedef int ShortPathTable[MAX_VERTEXES];//存储最短路径的权值数组 void CreateMGraph (MGraph *G)
{/* 创建 */
int i, j; //printf ("请输入顶点数和边数");
G->numVertexes = ;//顶点
G->numEdges = ;//边 for (i=; i<G->numVertexes; i++)
G->vexs[i] = i;//初始化顶点下标 for (i=; i<G->numVertexes; i++)//初始化矩阵
for (j=; j<G->numVertexes; j++)
if (i == j)
G->arc[i][j] = ;//本身则0
else
G->arc[i][j] = INFINITY;//否则为∞ //提前手动输入
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=; G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=; G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=; G->arc[][]=; for (i=; i<G->numVertexes; i++)//无向图--矩阵上三角对称下三角
for (j=i; j<G->numVertexes; j++)
if (i != j)
G->arc[j][i] = G->arc[i][j]; return ; } //P数组-存放最短路径顶点的下标,D数组-存放最短路径(权值)
void Shorsequence_Path_Dijkstra (MGraph G, int v0, PathArc *P, ShortPathTable *D)
{/* 迪杰斯特拉 算法 - 生成最短路径 */
int v, w, k, min;
int final[MAX_VERTEXES]; //final[w] = 1,表示求得顶点v0→vw的最短路径 for (v=; v<G.numVertexes; v++)
{//初始化
final[v] = ; //全部顶点初始化为未知最短路径状态
(*D)[v] = G.arc[v0][v]; //和v0有连线的点加上权值
(*P)[v] = -; //初始化路径下标数组初始值为-1;
} (*D)[v0] = ; //v0→v0的路径-权值-为0
final[v0] = ; //v0→v0不需要求路径 /* 开始主循环,每次循环求v0到某个v顶点的最短路径 */
for (v=; v<G.numVertexes; v++)
{
min = INFINITY; //初始化-目前所知离v0顶点的最近距离 //注意:这里不要想着w=v;因为程序执行的时候有的顶点不符合是直接跨过去了,然后置0是为了循环访问未访问的顶点
for (w=; w<G.numVertexes; w++)//查找和v0最近的顶点
if (!final[w] && (*D)[w]<min)
{//该顶点未被访问过,并且小于min
k = w; //k存入最近顶点的下标
min = (*D)[w]; //min存入最短路径
} final[k] = ; //将目前找到最近的顶点-做标记 for (w=; w<G.numVertexes; w++)//目前找到与v0最近的顶点下标k,然后继续寻找与k顶点最近的下标
if (!final[w] && (min+G.arc[k][w] < (*D)[w]))
{//若顶点未被访问 并且 (目前最短路径(权值)v0→k + 目前最近的顶点(k)有关联的顶点路径(权值))小于 v0有关联的权路径(权值)
(*D)[w] = min + G.arc[k][w];//则与k顶点相关的权值+min--覆盖D数组
(*P)[w] = k; //则与v0最近的顶点k顶点下标 给 P数组;
}//(*D)[w] = min实际上就是上一个顶点和k顶点最短路径的 + arc[k][w]
} return ;
} int main (void) {
int i, j, v0;
int number = ;
int sequence[MAX_VERTEXES][MAX_VERTEXES];
MGraph G;
PathArc P;
ShortPathTable D; //某点到各点的最短路径
v0 = ; CreateMGraph (&G); //创建 Shorsequence_Path_Dijkstra (G, v0, &P, &D);//迪杰斯特拉 算法 - 生成最短路径 //初始化正序输出的数组
for (i=; i<G.numVertexes; i++)
for (j=; j<G.numVertexes; j++)
sequence[i][j] = ; /* P数组-存放最短路径顶点的下标,D数组-存放最短路径(权值) */ printf ("最短路径倒序如下:\n");
for (i=; i<G.numVertexes; i++)
{
printf ("v%d--v%d\t: ", v0, i);
j = i;
while (P[j] != -)
{//若存在下一个顶点
printf ("%d ", P[j]);//则输出顶点
j = P[j];//按顺序查找
number ++;//记录(辅助正序输出)
} //离上一个顶点最近的顶点的下标-赋值给sequence数组
j = i;
while (<number && P[j] != -)
{
sequence[i][number--] = P[j];
j = P[j];
}
number = ;
printf ("\n");
} //自己修改的
printf ("\n最短路径正序如下:\n");
for (i=; i<G.numVertexes; i++)
{
j = ;
printf ("v%d--v%d\t: ", v0, i);
while (sequence[i][j] != )
printf ("%d ", sequence[i][j++]);
printf ("\n");
} printf ("\n源点到各个点的最短路径为:\n");
for (i=; i<G.numVertexes; i++)
printf ("v%d--v%d : %d\n", G.vexs[], G.vexs[i], D[i]); return ;
}
迪杰斯特拉(Dijkstra)算法的更多相关文章
- 迪杰斯特拉Dijkstra算法介绍
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...
- JS实现最短路径之迪杰斯特拉(Dijkstra)算法
最短路径: 对于网图来说,最短路径是指两个顶点之间经过的边上权值和最少的路径,我们称第一个顶点是源点,最后一个顶点是终点 迪杰斯特拉 ( Dijkstra) 算法是并不是一下子就求出 了 Vo 到V8 ...
- 最短路径算法-迪杰斯特拉(Dijkstra)算法在c#中的实现和生产应用
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止 贪心算法(Greedy ...
- 最短路径-迪杰斯特拉(dijkstra)算法及优化详解
简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...
- C# 迪杰斯特拉(Dijkstra)算法
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 其基本思想是,设置顶点集合S并不断地作 ...
- 最短路径 - 迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析
什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...
- 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(二)
一.基于邻接表的Dijkstra算法 如前一篇文章所述,在 Dijkstra 的算法中,维护了两组,一组包含已经包含在最短路径树中的顶点列表,另一组包含尚未包含的顶点.使用邻接表表示,可以使用 BFS ...
- 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(一)
一.算法介绍 迪杰斯特拉算法(英语:Dijkstra's algorithm)由荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年提出.迪杰斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题. ...
随机推荐
- windows下安装配置Xampp
XAMPP是一款开源.免费的网络服务器软件,经过简单安装后,就可以在个人电脑上搭建服务器环境.本文为大家介绍Windows中安装XAMPP(Apache+Mysql+PHP)及使用方法及其相关问题的总 ...
- 九章算法系列(#4 Dynamic Programming)-课堂笔记
前言 时隔这么久才发了这篇早在三周前就应该发出来的课堂笔记,由于懒癌犯了,加上各种原因,实在是应该反思.好多课堂上老师说的重要的东西可能细节上有一些急记不住了,但是幸好做了一些笔记,还能够让自己回想起 ...
- linux swap 分区调控(swap分区 lvm管理)
注:linux swap分区 采用lvm管理,调控可以采用下面的方法 一.查看 swap lv [root@testdb ~]# vgdisplay -v Finding all volume ...
- (一)boost库之日期、时间
(一)boost库之日期.时间 一.计时器 计时器,通常在一个项目中统计一个函数的执行时间是非常实用的. #include <boost/timer.hpp> void PrintU ...
- MFC窗口的父子关系和层级关系
一直对窗口之间的关系有些混乱,遇到需要指定父窗口的函数时常常要考虑很久,究竟父窗口是哪个窗口,遂上网查资料,略有所悟,简记如下: 对话框中的所有控件(比如Button等)都是其子窗口. ...
- extjs让按钮可用或者不可用
Ext.getCmp(‘按钮ID’).enable();//设置为可用Ext.getCmp(‘按钮ID’).disable();//设置为不可用
- gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解
摘自http://blog.csdn.net/elfprincexu/article/details/45043971 gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解 C和C+ ...
- Hibernate问题之'hibernate.dialect' not set
继前文:Hibernate4中buildSessionFactory方法废弃问题.后 继续有问题.本来之前好好的项目,用了这种新的方法后发现问题. 出现 Connection cannot be n ...
- web项目中获取各种路径的方法
~Apple web项目中各种路径的获取 1.可以在servlet的init方法里 String path = getServletContext().getRealPath("/&qu ...
- C#获取变量名的扩展方法
// </summary> /// <param name="var_name"></param> /// <param name=&qu ...