# 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. Python 自学笔记(一)环境搭建

    一,关于Python的介绍 关于Python的介绍,我不想多说了,网上随便一搜,很多介绍,这里我主要写下我的自学Python的 过程,也是为了促进我能继续学习下去. 二,环境搭建 1,这里我只讲解Wi ...

  2. QT5中如何使用QFtp类(这个类虽然没有被收录,但一直在更新)

    由于QT5对QML的支持有很大的改进,所以打算将原来基于QT4的程序移植到QT5上,在移植用QFtp类写的程序时傻眼了! Qt5 移除了 QFtp API,原因是其实现质量.QNetworkAcces ...

  3. Serv-U无法连接到服务器127.0.0.1,端口43958 FTP服务器不能启动

    端口43958,这是Serv-U的本地管理端口,只允许127.0.0.1连接.    在出现“Serv-U无法连接到服务器127.0.0.1,端口43958”这个错误的时候,一般ftp软件无法自动启动 ...

  4. [Leetcode][Python]52: N-Queens II

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 52: N-Queens IIhttps://oj.leetcode.com/ ...

  5. linux之SQL语句简明教程---函数

    既然数据库中有许多资料都是已数字的型态存在,一个很重要的用途就是要能够对这些数字做一些运算,例如将它们总合起来,或是找出它们的平均值.SQL 有提供一些这一类的函数.它们是: AVG (平均) COU ...

  6. thecorner.com.cn - Customer Care

    thecorner.com.cn - Customer Care 所有主题 帮助 关于我们 thecorner.com 是通过专业的"迷你商店"形式荟萃最新男士.女士精选时尚商品和 ...

  7. 《Effective C++ 》学习笔记——条款03

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  8. MResource

    public class MResource { public static int getIdByName(Context context, String className, String nam ...

  9. About Quick Packaging and Custom Packaging

    About Quick Packaging and Custom Packaging The Enterprise Manager Support Workbench provides two met ...

  10. 用Teleport Ultra下载网站全部页面 爬虫

    测试case,就是把Commons-FileUpload 的API下载来   上网查的时候我才发现这是一个由很多页面组成的网站,下载起来很麻烦.   怎么办呢?呵呵,一定是有办法的.Teleport ...