# 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)算法的更多相关文章

  1. 迪杰斯特拉Dijkstra算法介绍

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...

  2. JS实现最短路径之迪杰斯特拉(Dijkstra)算法

    最短路径: 对于网图来说,最短路径是指两个顶点之间经过的边上权值和最少的路径,我们称第一个顶点是源点,最后一个顶点是终点 迪杰斯特拉 ( Dijkstra) 算法是并不是一下子就求出 了 Vo 到V8 ...

  3. 最短路径算法-迪杰斯特拉(Dijkstra)算法在c#中的实现和生产应用

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止 贪心算法(Greedy ...

  4. 最短路径-迪杰斯特拉(dijkstra)算法及优化详解

    简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...

  5. C# 迪杰斯特拉(Dijkstra)算法

    Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 其基本思想是,设置顶点集合S并不断地作 ...

  6. 最短路径 - 迪杰斯特拉(Dijkstra)算法

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

  7. 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析

    什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...

  8. 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(二)

    一.基于邻接表的Dijkstra算法 如前一篇文章所述,在 Dijkstra 的算法中,维护了两组,一组包含已经包含在最短路径树中的顶点列表,另一组包含尚未包含的顶点.使用邻接表表示,可以使用 BFS ...

  9. 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(一)

    一.算法介绍 迪杰斯特拉算法(英语:Dijkstra's algorithm)由荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年提出.迪杰斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题. ...

随机推荐

  1. lda模型的python实现

    LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,最近看了点资料,准备使用python实现一下.至于数学模型相关知识,某度一大堆,这里也给出之前参考过的一个挺详细 ...

  2. Listview注意事项

    1.缓存 @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder ho ...

  3. DataSet 中的数据排序 及 DataRow装成DataTable

    1.DataSet 中的数据排序 DataSet ds = new DataSet(); // 获取当前排口的数据 ds = _xiaobill.GetHistoryData(yinZiBianm, ...

  4. CompressFilterAttribute 文件压缩特性

    /// <summary> /// 文件压缩特性 /// </summary> public class CompressFilterAttribute : ActionFil ...

  5. Boost库学习之旅入门篇

    学习及使用Boost库已经有一段时间了,Boost为我的日常开发中带来了极大的方便,也使得我越来越依赖于boost库了.但boost功能太多,每次使用还是得翻看以前的 资料,所以为了以后可以更方便的使 ...

  6. 28 个 Unix/Linux 的命令行神器

    28 个 Unix/Linux 的命令行神器   下面是Kristóf Kovács收集的28个Unix/Linux下的28个命令行下的工具(原文链接),有一些是大家熟悉的,有一些是非常有用的,有一些 ...

  7. C语言的本质(13)——指向指针的指针

    指针可以指向基本类型,也可以指向复合类型,因此一个指针变量存放的可以是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量.由于指针变量直接指向变量,所以称为"单级间址".而 ...

  8. 如何有效地配置基于Spring的应用系统

    Spring为应用系统的开发提供了极大的方便,其IoC反向注入(或DI依赖注入)的概念也彻底地改变了旧的编程方式,让我们只需关注如何使用对象,而创建对象交给Spring去完成,即把使用对象和创建对象分 ...

  9. 栈ADT的数组实现

    /* 栈的数组实现声明 */ struct StackRecord; typedef struct StackRecord *Stack; #define MinSstackSize 5 #defin ...

  10. 【JSP动态网站】JDBC连接SqlServer 2008数据库

    JSP程序需要通过JDBC接口才能访问数据库. 启动MyEclipse,选择“Window”→“Open Perspective”→“MyEclipse Database Explorer”菜单项,打 ...