迪杰斯特拉(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年提出.迪杰斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题. ...
随机推荐
- 判断括号匹配(nyoj2水)
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=1 ...
- LINUX下QT与C语言通过网卡名获取网卡IP与MAC
1.QT下 QString RuntimeConfig::ipAddress(QString network) { QList<QNetworkAddressEntry> list; QS ...
- Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...
- linux上应用随机启动
这是个go项目,其他的可以参考. 首先要有个脚本比如demo #!/bin/bash # # etcd This shell script takes care of starting and sto ...
- session_cache_limiter 及 session 常见问题
我点击后退按钮,为什么之前填写的东西不见 这是因为你使用了session. 解决办法: PHP代码:-------------------------------------------------- ...
- LINUX 暂停、继续进程
LINUX 暂停.继续进程 kill -STOP 1234 将该进程暂停. 如果要让它恢复到后台,用kill -CONT 1234 (很多在前台运行的程序这样是不行的) 如果要恢复到前台,请在当时运行 ...
- bzoj2014 [Usaco2010 Feb]Chocolate Buying
Description 贝西和其他奶牛们都喜欢巧克力,所以约翰准备买一些送给她们.奶牛巧克力专卖店里 有N种巧克力,每种巧克力的数量都是无限多的.每头奶牛只喜欢一种巧克力,调查显示, 有Ci头 ...
- 电子科大POJ "孤单整数"
孤单整数 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) C-sources: ...
- 甲骨文推动Java进军“物联网”
该公司希望在嵌入式设备开发项目上Java可以取代C 随着周二宣布对嵌入式的Java版本进行升级,甲骨文希望扩展该平台到新一代连接设备,又名物联网.甲骨文还希望,Java可以在一些嵌入式开发项目 ...
- MediaInfo使用简介(新版本支持HEVC)
MediaInfo 用来分析视频和音频文件的编码和内容信息,是一款是自由软件 (免费使用.免费获得源代码).他除了提供DLL之外,本身也提供GUI工具用于查看视频信息.我使用中发现,新版本的Media ...