图中最短路径算法(Dijkstra算法)(转)
1.Dijkstra
1) 适用条件&范围:
a) 单源最短路径(从源点s到其它所有顶点v);
b) 有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图)
c) 所有边权非负(任取(i,j)∈E都有Wij≥0);
2) 算法描述:
在带权图中最常遇到的问题就是,寻找两点间的最短路径问题。
解决最短路径问题最著名的算法是Djikstra算法。这个算法的实现基于图的邻接矩阵表示法,它不仅能够找到任意两点的最短路径,还可以找到某个指定点到其他所有顶点的最短路径。
此算法的基本思想是:
1>选中指定的顶点,列出此顶点到其他的顶点的权值,不相邻的为无穷大
2>从以上权值中选出最小值,此最小值就是起始点到对应顶点的最短路径,并标记这个对应顶点
3> 将起始点到其他未标记的顶点的直接距离与起始点到刚才标记顶点加上标记顶点到其他顶点距离的和比较,如果 后者小,则更新对应的权值。
4> 转2
程序代码如下:
#include <iostream>
#include <iomanip>
using namespace std;
#include "Graph.h"
void main()
{
int i, n;
cout << "输入你所输入的有向带权图的顶点个数: ";
cin >> n;
adjmatrix g;
InitMatrix(g);
CreateMatrix(g);
cout << "你输入的有向带权图的邻接矩阵表示为: " << endl;
PrintMatrix(g, n);
int * d = new int [n];
edgenode ** path = new edgenode * [n];
cout << "请输入你要输入的源点: ";
cin >> i;
Dijkstra(g, d, path, i, n);
PrintPath(d, path, i, n);
}
//***********Graph.h**********************
#define MaxVerNum 20
#define MaxValue 10000
typedef int adjmatrix[MaxVerNum][MaxVerNum]; //邻接矩阵的类型定义
typedef struct Node
{
int adjvex;
struct Node * next;
}edgenode; //指针数组path[]基类型定义
//初始化邻接矩阵表示的有向带权图
void InitMatrix(adjmatrix G)
{
int i, j;
for(i = 0; i < MaxVerNum; i++)
for(j = 0; j < MaxVerNum; j++)
G[i][j] = MaxValue;
}
//建立邻接矩阵表示的有权带向图(即通过输入图的每条边建立图的邻接矩阵)
void CreateMatrix(adjmatrix G)
{
int i, j, x;
cout << "请输入顶点和相应的权值: " << endl;
cin >> i >> j >> x;
while(i != -1)
{
G[i][j] = x;
cin >> i >> j >> x;
}
}
//输出邻接矩阵表示的有向带权图(即输出图的每条边)
void PrintMatrix(adjmatrix G, int n)
{
int i, j;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if(G[i][j] == MaxValue)
cout << setiosflags(ios::left) << setw(5) << "Inf";
else
cout << setiosflags(ios::left) << setw(5) << G[i][j];
}
cout << endl;
}
}
void Path(edgenode * path[], int m, int j)
{
edgenode * p, * q, *s;
p = path[j];
while(p != NULL)
{
path[j] = p->next;
delete p;
p = path[j];
}
p = path[m];
while(p != NULL)
{
q = new edgenode;
q->adjvex = p->adjvex;
if(path[j] == NULL)
path[j] = q;
else
s->next = q;
s = q;
p = p->next;
}
q = new edgenode;
q->adjvex = j;
q->next = NULL;
s->next = q;
}
//求最短路径的Dijkstral算法
void Dijkstra(adjmatrix GA, int dist[], edgenode *path[], int i, int n)
{
int j, k, w, m;
bool * s = new bool[n];
for(j = 0; j < n; j++)
{
if(j == i)
s[j] = true;
else
s[j] = false;
dist[j] = GA[i][j];
if(dist[j] < MaxValue && j != i)
{
edgenode * p1 = new edgenode;
edgenode * p2 = new edgenode;
p1->adjvex = i;
p2->adjvex = j;
p2->next = NULL;
p1->next = p2;
path[j] = p1;
}
else
path[j] = NULL;
}
for(k = 1; k <= n-2; k++)
{
w = MaxValue;
m = i;
for(j = 0; j < n; j++)
if(s[j] == false && dist[j] < w)
{
w = dist[j];
m = j;
}
if(m != i)
s[m] = true;
else
break;
for(j = 0; j < n; j++)
if(s[j] == false && dist[m] + GA[m][j] < dist[j])
{
dist[j] = dist[m]+GA[m][j];
Path(path, m, j);
}
}
delete []s;
}
//输出从源点到每个顶点的最短路径及长度的函数
void PrintPath(int dist[], edgenode * path[], int i, int n)
{
int j;
for(j = 0; j < n; j++)
{
if(i != j)
{
cout << "顶点v" << i << "到顶点v" << j << "的最短路径的长度为 "
<< dist[j] << ", 最短路径为: ";
edgenode * p = path[j];
while(p != NULL)
{
cout << setw(4) << p->adjvex;
p = p->next;
}
cout << endl;
}
}
}
程序运行结果:
输入你所输入的有向带权图的顶点个数: 6
请输入顶点和相应的权值:
0 1 10
0 2 12
1 3 16
1 4 25
2 0 4
2 1 3
2 3 12
2 5 8
3 4 7
5 3 2
5 4 10
-1 2 3
你输入的有向带权图的邻接矩阵表示为:
Inf 10 12 Inf Inf Inf
Inf Inf Inf 16 25 Inf
4 3 Inf 12 Inf 8
Inf Inf Inf Inf 7 Inf
Inf Inf Inf Inf Inf Inf
Inf Inf Inf 2 10 Inf
请输入你要输入的源点: 0
顶点v0到顶点v1的最短路径的长度为 10, 最短路径为: 0 1
顶点v0到顶点v2的最短路径的长度为 12, 最短路径为: 0 2
顶点v0到顶点v3的最短路径的长度为 22, 最短路径为: 0 2 5 3
顶点v0到顶点v4的最短路径的长度为 29, 最短路径为: 0 2 5 3 4
顶点v0到顶点v5的最短路径的长度为 20, 最短路径为: 0 2 5
Press any key to continue
转自:http://blog.sina.com.cn/s/blog_51b6521b0100k96c.html
图中最短路径算法(Dijkstra算法)(转)的更多相关文章
- python数据结构与算法——图的最短路径(Dijkstra算法)
# Dijkstra算法——通过边实现松弛 # 指定一个点到其他各顶点的路径——单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, ...
- 最短路径之Dijkstra算法及实例分析
Dijkstra算法迪科斯彻算法 Dijkstra算法描述为:假设用带权邻接矩阵来表示带权有向图.首先引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点Vi的最短路径.它的初始 ...
- 单源最短路径(dijkstra算法)php实现
做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...
- 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)
一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...
- 【算法设计与分析基础】25、单起点最短路径的dijkstra算法
首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...
- 数据结构与算法--最短路径之Dijkstra算法
数据结构与算法--最短路径之Dijkstra算法 加权图中,我们很可能关心这样一个问题:从一个顶点到另一个顶点成本最小的路径.比如从成都到北京,途中还有好多城市,如何规划路线,能使总路程最小:或者我们 ...
- 单源点最短路径的Dijkstra算法
在带权图(网)里,点A到点B所有路径中边的权值之和为最短的那一条路径,称为A,B两点之间的最短路径;并称路径上的第一个顶点为源点(Source),最后一个顶点为终点(Destination).在无权图 ...
- 最短路径 | 深入浅出Dijkstra算法(一)
参考网址: https://www.jianshu.com/p/8b3cdca55dc0 写在前面: 上次我们介绍了神奇的只有五行的 Floyd-Warshall 最短路算法,它可以方便的求得任意两点 ...
- 经典树与图论(最小生成树、哈夫曼树、最短路径问题---Dijkstra算法)
参考网址: https://www.jianshu.com/p/cb5af6b5096d 算法导论--最小生成树 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树. im ...
- (转)最短路算法--Dijkstra算法
转自:http://blog.51cto.com/ahalei/1387799 上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...
随机推荐
- 2013年8月份第4周51Aspx源码发布详情
迷你桌面闹钟源码 2013-8-27 [VS2010]功能介绍:实现了定时闹钟的功能,可以设置闹钟最前端显示.感兴趣的可以下载学习. BR个人博客系统(课程设计)源码 2013-8-27 [VS2 ...
- poj1080 dp
//Accepted 200 KB 0 ms //dp //dp[i][j]表示s1用前i个,s2用前j个字符能得到的最大分数 //dp[i][j]=max(dp[i-1][j]+score[s1[i ...
- (转)Ratchet教程:meta与link标签
原文:http://www.w3cplus.com/mobile/meta-and-link-tags-for-ratchet.html Ratchet教程:meta与link标签 ...
- HackRF实现无线门铃信号分析重放
文章特点:数据解码方面实在是没什么信心,存在分析错乱的可能性,所幸发出来共同探讨,恳请鞭策. 0x01 概述 这是一款工作在315Mhz频段的无线遥控门铃,根据查阅官方手册以及芯片信息,确定其采用了e ...
- linux常用命令:4文件压缩和解压命令
文件压缩和解压命令 压缩命令:gzip.tar[-czf].zip.bzip2 解压缩命令:gunzip.tar[-xzf].unzip.bunzip2 1. 命令名称:gzip 命令英文原意:GNU ...
- HDU5772 (最小割)
Problem String problem (HDU5772) 题目大意 给定一个由数字组成的字符串(n<=100),挑选出一些字符组成一个新的字符串. 字符串的价值: sigma w[id( ...
- 重学STM32---(五)ADC
这两天把外部中断和ADC看了下,个人感觉外部中断不是很难,也就没有把记下来了,毕竟写这个挺浪费时间.ADC是比较复杂的,如果想让完全自由的运用ADC必须经过多次实践可能才可以.由于已经学过库函数,也就 ...
- iOS-申请开发证书流程
1.开发者证书(分为开发和发布两种,类型为ios Development,ios Distribution),这个是最基础的,不论是真机调试,还是上传到appstore都是需要的,是一个基证书,用来证 ...
- C++学习笔记3:一些错误
错误1:执行程序后,控制台闪烁后退出 处理办法: (1)添加头文件:#include <iostream> (2)在程序返回前添加代码: std::cin.clear();//清除错误标志 ...
- centOS7 修改hostname
hostnamectl set-hostname 你要修改到的hostname localectl set-locale LANG=要修改的语言 介绍个Centos 7很不错的教程网站:h ...