Dijkstra算法构造单源点最短路径
Dijkstra()
{
初始化Dist、Path、final // 每次求得v0到某顶点v的最短路径
while (图的顶点数-)
{
. 找到非最短路径顶点集中距V0最近的顶点v 得到其顶点下标和距离
将v加入到最短距离顶点集合中
打印相关内容 . 依次修改其它未得到最短路径顶点的Dist[k]值
假设求得最短路径的顶点为u,
则 Dist[k] =min( Dist[k], Dist[u] + G.arcs[u][k] )
同时修改Path[k]:Path[k] = Path[u] +G.vex[k]
}
}
实例:

源代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
using namespace std; #define MAX_VERTEX_NUM 100
#define MAX_EDGE_NUM 200
#define MAX_VERTEX_NAMELEN 100
#define INF 65535 typedef struct{
char name[MAX_VERTEX_NAMELEN];
}VerType; // 图的邻接矩阵存储结构
typedef struct{
int VertexNum,EdgeNum; // 顶点数,边数
VerType Vertex[MAX_VERTEX_NUM]; // 顶点集
int Edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 边集
}MGragh; // 邻接矩阵建图
void CreateMGragh(MGragh *Gra)
{
int i,j,k,w;
char v1[MAX_VERTEX_NAMELEN],v2[MAX_VERTEX_NAMELEN]; printf("请输入顶点数及边数(顶点数 边数)\n");
scanf("%d %d%*c",&(Gra->VertexNum),&(Gra->EdgeNum)); printf("请输入顶点信息\n");
for (i=; i<Gra->VertexNum; i++){
printf("%d.",i+);
gets(Gra->Vertex[i].name);
} // 初始化邻接矩阵
for (i=; i<Gra->VertexNum; i++){
for (j=; j<Gra->VertexNum; j++){
if (i==j){
Gra->Edge[i][j] = ; // 各点到自己的距离为0
}
else{
Gra->Edge[i][j] = INF; // 各点到不相邻的点距离为无穷
}
}
} printf("请输入边信息(顶点,顶点,权值)\n");
for (i=; i<Gra->EdgeNum; i++){
printf("%d.",i+);
scanf("%[^,]%*c%[^,]%*c%d%*c",v1,v2,&w); for (j=; j<Gra->VertexNum; j++){
for (k=; k<Gra->VertexNum; k++){
if (strcmp(Gra->Vertex[j].name,v1) == && strcmp(Gra->Vertex[k].name,v2) == ){
Gra->Edge[j][k] = w;
}
}
}
}
} int Dist[MAX_VERTEX_NUM]; // 存储VO到各点的最短路径的权值和
string ShortPath[MAX_VERTEX_NUM]; // 存储V0到各点的最短路径 void ShortPathByDijkstra(MGragh *Gra,int vo)
{
printf("\n最短路径为:\n");
int v,w,k,min;
int final[MAX_VERTEX_NUM]; // final[w]=1 表示已经求得顶点V0到Vw的最短路径 // 初始化数据
for (v=; v<Gra->VertexNum; v++){
final[v] = ; // 全部顶点初始化为未找到最短路径
Dist[v] = Gra->Edge[vo][v]; // 将与vo点有连线的顶点加上权值
if (Dist[v] != INF && Dist[v] != ){
ShortPath[v] += Gra->Vertex[vo].name;
ShortPath[v] += Gra->Vertex[v].name;
}
else{
ShortPath[v] = "";
} // 记录由V0连出去的边的路径 如AB、AC
}
Dist[vo] = ; // v0到自己的路径为0
final[vo] = ; // 标记已经找到v0到自己的最短路径 // 每次求得vo到某顶点V的最短路径
for (v=; v<Gra->VertexNum; v++){
min = INF; // 将某点加入最短路径顶点集
for (w=; w<Gra->VertexNum; w++){
if (final[w] == && Dist[w]<min){
k = w;
min = Dist[w];
}
} // 找到非最短路径顶点集中距V0最近的顶点 得到其顶点下标和距离
final[k] = ; // 将目前找到最近的顶点置1 即将该点加入最短路径顶点集
printf("%d\t",Dist[k]);
cout << ShortPath[k] << endl; // 修正当前最短路径及距离
for (w=; w<Gra->VertexNum; w++){
// 如果经过v顶点的路径比现在这条路径的长度短的话就更新
if (final[w] == && (min+Gra->Edge[k][w]) < Dist[w]){
Dist[w] = min + Gra->Edge[k][w];
ShortPath[w] = ShortPath[k];
ShortPath[w] += Gra->Vertex[w].name;
}
}
}
} int main()
{
MGragh g;
CreateMGragh(&g);
ShortPathByDijkstra(&g,);
return ;
}
测试用例及结果:

Dijkstra算法构造单源点最短路径的更多相关文章
- Bellman-Ford & SPFA 算法——求解单源点最短路径问题
Bellman-Ford算法与另一个非常著名的Dijkstra算法一样,用于求解单源点最短路径问题.Bellman-ford算法除了可求解边权均非负的问题外,还可以解决存在负权边的问题(意义是什么,好 ...
- Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32824 Accepted: 11098 Description Bes ...
- Dijkstra算法解决单源最短路径
单源最短路径问题:给定一个带权有向图 G = (V, E), 其中每条边的权是一个实数.另外,还给定 V 中的一个顶点,称为源.现在要计算从源到其他所有各顶点的最短路径长度.这里的长度是指路上各边权之 ...
- 【算法】Dijkstra算法(单源最短路径问题)(路径还原) 邻接矩阵和邻接表实现
Dijkstra算法可使用的前提:不存在负圈. 负圈:负圈又称负环,就是说一个全部由负权的边组成的环,这样的话不存在最短路,因为每在环中转一圈路径总长就会边小. 算法描述: 1.找到最短距离已确定的顶 ...
- 【转】Dijkstra算法(单源最短路径)
原文:http://www.cnblogs.com/dolphin0520/archive/2011/08/26/2155202.html 单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路 ...
- Dijkstra算法详细(单源最短路径算法)
介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...
- Dijkstra算法求单源最短路径
Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...
- SPFA算法与dijkstra算法求单源最短路径的比较
SPFA是运用队列,把所有的点遍历到没有能更新的,点可以重复入队 如题http://www.cnblogs.com/Annetree/p/5682306.html dijkstra是每次找出离源点最近 ...
- Dijkstra单源点最短路径算法
学习参考: Dijkstra算法(单源最短路径) 最短路径—Dijkstra算法和Floyd算法 使用的图结构: 邻接矩阵: -1 20 -1 25 80-1 -1 40 -1 -1-1 -1 -1 ...
随机推荐
- 『奇葩问题集锦』npm install 报错 node-pre-gyp ERR! node-pre-gyp -v v0.6.25
gyp ERR! configure error gyp ERR! stack Error: Can't find Python executable "python", you ...
- CI的面向切面的普通权限验证
第一步:开启CI的钩子配置,此次不多说看CI手册即可. 第二步:在cofig/hooks.php中进行钩子配置,CI手册中有记载 <?php defined('BASEPATH') OR exi ...
- ionic移动开发入门
学习资料:http://www.ionic.wang http://www.ionicframework.com/
- Swift(三.函数)
一.swift中的函数分为以下几类吧 1>无参无返 2>无参有返 3>有参无返 4>有参有返 5>有参多返 二.看下面几个例子吧 1>无参无返 func a ...
- 《C和指针》章节后编程练习解答参考——第10章
10.1 #include <stdio.h> typedef struct { unsigned ]; unsigned ]; unsigned ]; }TelphoneNumber; ...
- Android 自定义RadioButton实现
由于使用小米系统MIUI运行是RadioButton样式跟google Android API自定义的不一样,则我们可以定义任何想要的东东.没有做不到,只有想不到 Android 自定义RadioBu ...
- Html5 跨域通信
H5 跨域通信: 在主页面中通过iframe嵌入外部页面,通过iframe的window对象postMessage方法向iframe页面传递消息. 1 <!DOCTYPE html> 2 ...
- perl 监控数据库用到的数据结构
[root@yun1 test]# cat a1.pl my $h={'192.168.11.187'=>['root','1234567'], '192.168.5.7' =>['roo ...
- 转:Java图形化界面设计——布局管理器之FlowLayout(流式布局)其他请参考转载出处网址
http://blog.csdn.net/liujun13579/article/details/7771191 前文讲解了JFrame.JPanel,其中已经涉及到了空布局的使用.Java虽然可以以 ...
- Rewriting History with Git Rebase
http://code.tutsplus.com/tutorials/rewriting-history-with-git-rebase--cms-23191 1. Rebasing for a Li ...