有源点最短路径--Dijkstra算法
问题描述:一个带权有向图G与源点v,求从源点v到G中其他顶点的最短路径,并限定各边权值大于0
它的思想在于,对顶点集划分为两组,第一组为已经求出的最短路径的集合(S),期初只有一个顶点,此后每求出一个最短路径v,....u,将顶点u加入集合S中,知道全部顶点U加入到S中,第二组即为未确最短路径的顶点集合。当然,更详细的解释可以参考书本
图:
略(0.0~)
#include <stdio.h>
#include <malloc.h>
#include <iostream>
using namespace std;
#define INFINITY 32767//假设权值不超过INFINITY
#define MAX_VERTEX_NUM 20
#define TRUE true
#define FALSE false
typedef char VertexType;
typedef enum{DG,DN,UDG,UDN}GraphKind;//有向图,有向网,无向图,无向网 typedef struct
{ // 图的定义
VertexType vexs[MAX_VERTEX_NUM]; //顶点信息
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum; // 图的当前顶点数
int arcnum; //图的边数
GraphKind kind; // 图的种类标志
}MGraph; int LocateVex(MGraph G,VertexType v)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(v==G.vexs[i]) return i;
}
return -1;
} void CreateDG(MGraph &G)
{
int i,j,k,w; char flag;
VertexType v1,v2;
G.kind = DG;
printf("请输入有向图的顶点数、边数\n");
scanf("%d %d",&G.vexnum,&G.arcnum);
printf("请依次输入顶点信息\n");
for(i=0;i<G.vexnum;i++)
{
cout<<"第"<<i+1<<"个顶点为:";
cin>>G.vexs[i];
for(j=0;j<i;j++)
{
if(G.vexs[j]==G.vexs[i])break;
}
if(j<i)
{
i--;
printf("已存在这样的顶点,请重新输入!\n");
continue;
}
} for(i=0;i<G.vexnum;i++)
{
for(j=0; j<G.vexnum; j++) G.arcs[i][j]=INFINITY;
} for(k=0;k<G.arcnum;k++)
{
cout<<"请输入一条弧尾:";
cin>>v1;
cout<<"请输入一条弧头:";
cin>>v2;
cout<<"请输入相应边的权值:";
cin>>w;
i=LocateVex(G,v1); j=LocateVex(G,v2);
if(G.arcs[i][j]==INFINITY)
{
G.arcs[i][j]=w;
}
else
{
printf("已存在该边,是否要重新确定其权值?按下“Y”确定,按其他键继续输入其它边\n");
scanf("%c",&flag);
if(flag=='y'||flag=='Y')
{
G.arcs[i][j]=w;
}
k--;
}
}//end of for
} void Dijkstra(MGraph G,int v0,bool P[][MAX_VERTEX_NUM], int D[])
{
int final[MAX_VERTEX_NUM];
int v,i,j,w; int min;
for(v=0;v<G.vexnum;++v)
{
final[v]=FALSE; D[v]=G.arcs[v0][v];
for(w=0;w<G.vexnum;++w) P[v][w]=FALSE;
if(D[v]<INFINITY) {P[v][v0]=TRUE;P[v][v]=TRUE;}
}
D[v0]=0; final[v0]=TRUE;
for(i=1;i<G.vexnum;++i)//其余G.vexnum-1个顶点
{
min=INFINITY;
for(w=0; w<G.vexnum; ++w)
{
if(!final[w] && D[w]<min)
{
v=w; min=D[w];
}
}
final[v]=TRUE;
for(w=0;w<G.vexnum;++w)
{
if(!final[w] && min+G.arcs[v][w]<D[w])
{
D[w]=min+G.arcs[v][w];
for(j=0;j<G.vexnum ;++j) P[w][j]=P[v][j];
P[w][w]=TRUE;
}
}
}
} int main()
{
MGraph G; char v;int v0,i,j;
int D[MAX_VERTEX_NUM];
bool P[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
CreateDG(G); printf("请输入源点编号:");
cin>>v; v0=LocateVex(G,v); Dijkstra(G,v0,P,D);
for(i=0;i<G.vexnum;i++)
{
printf("编号为%c的顶点到编号为%c的顶点的最短路径长度为:%d,路经为:",v,G.vexs[i],D[i]);
for(j=0;j<G.vexnum&&P[i][j];j++) printf("%c ",G.vexs[j]);
printf("\n");
}
}
运行结果:

有源点最短路径--Dijkstra算法的更多相关文章
- 最短路径-Dijkstra算法与Floyd算法
一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1 ADE:2 ADCE:3 ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...
- 最短路径——Dijkstra算法以及二叉堆优化(含证明)
一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...
- 有向网络(带权的有向图)的最短路径Dijkstra算法
什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- 网络最短路径Dijkstra算法
最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...
- 单源最短路径Dijkstra算法,多源最短路径Floyd算法
1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...
- 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )
数据结构实验之图论七:驴友计划 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
- 求两点之间最短路径-Dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...
- 最短路径—Dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...
随机推荐
- python:Json模块dumps、loads、dump、load介绍
由上篇文章(python3+requests:get/post请求)涉及到的json.dumps()扩展 1.json.dumps()用于将dict类型的数据转成str 备注:文件路径前面加上 r 是 ...
- .NET开发微信小程序-生成二维码
1.生成小程序二维码功能 直接请求相应的链接.传递相应的参数 以生成商铺的付款码为例: var shopsId = e.ShopsId //付款码的参数 var codeModel = new fun ...
- 导出excel记录
前言: 记录这篇使用记录,是为了方便以后学习查阅和让没有使用过的人了解一下,其中不足还请见谅.不是很全的文章,大神请绕行. 在项目中我们或多或少的会遇到数据导出到excel表格以便线下查看或者记录一些 ...
- 使用 GNU profiler 来提高代码运行速度
各种软件对于性能的需求可能会有很大的区别,但是很多应用程序都有非常严格的性能需求,这一点并不奇怪.电影播放器就是一个很好的例子:如果一个电影播放器只能以所需要速度的 75% 来播放电影,那么它几乎就没 ...
- centos6 安装配置ss笔记
2018-05-17 centos6 安装配置ss笔记 操作环境:Centos 6 x86_64 bbr 服务器地址:美国 1.准备VPS 在https://www.bwh1.net可购买,购买时已默 ...
- 常用的HTML富文本编译器UEditor、CKEditor、TinyMCE、HTMLArea、eWebEditor、KindEditor简介
1.UEditor UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于BSD协议,允许自由使用和修改代码... 主要特点: 轻量级: ...
- ;(function(){})()这种写法分号的作用 todomvc
常看到一些大牛的JS源码 在function 前面加; ;function($,undefined) 是什么用处 ? ;(function($){$.extend($.fn... 在前面加分号可以有多 ...
- 最近最久未使用页面淘汰算法———LRU算法(java实现)
请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. LRU算法,即Last Recently Used ---选择最后一次访问时间距离当前时间最长的一页并淘汰之--即淘汰最长时间没有使用的页 按照 ...
- Android 自定义ViewGroup手把手教你实现ArcMenu
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37567907 逛eoe发现这样的UI效果,感觉很不错,后来知道github上有这 ...
- Elasticsearch笔记七之setting,mapping,分片查询方式
Elasticsearch笔记七之setting,mapping,分片查询方式 setting 通过setting可以更改es配置可以用来修改副本数和分片数. 1:查看,通过curl或浏览器可以看到副 ...