有源点最短路径--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 ...
随机推荐
- zfs文件系统简单使用
关于ubuntu下zfs的使用参考:https://github.com/zfsonlinux/zfs/wiki/Ubuntu%2016.04%20Root%20on%20ZFS 安装zfs: 启动z ...
- Http Header信息
REMOTE_ADDR – 访问客户端的 IP 地址 HTTP_VIA – 如果有该条信息, 就证明您使用了代理服务器,代理服务器的地址就是后面的数值. HTTP_X_FORWARDED_FOR – ...
- 节流throttle和防抖debounce
underscore.js提供了很多很有用的函数,今天想说说其中的两个.这两个函数都用于限制函数的执行. debounce 在解释这个函数前,我们先从一个例子看下这个函数的使用场景.假设我们网站有个搜 ...
- css3 resize属性
http://www.w3school.com.cn/cssref/pr_resize.asp 实例 规定可以由用户调整 div 元素的大小: div { resize:both; overflow: ...
- SpringMVC表当重复提交
最近公司上线,有同志进行攻击,表当防重复提交也没有弄,交给我 ,本人以前也没弄过,知道大概的思路,但是那样实在是太麻烦了,虽然后面试过使用过滤器加拦截器实现,不过还是有点小麻烦. 后来在网上搜索后发现 ...
- Linux kernel的中断子系统之(九):tasklet
返回目录:<ARM-Linux中断系统>. 总结: 二介绍了tasklet存在的意义. 三介绍了通过tasklet_struct来抽想一个tasklet,每个CPU维护一个tasklet链 ...
- CentOS 安装Python3.x常见问题
CentOS 6.x自带的Python版本是2.6,CentOS 7.x上自带的是2.7,我们要自己安装Python3.X,配置环境,不过一般安装过程不会一帆风顺,往往有些报错,在CentOS以及其他 ...
- Scrapy 1.4 文档 05 命令行工具
在系统命令行中,使用 scrapy 命令可以创建工程或启动爬虫,它控制着 Scrapy 的行为,我们称之为 Scrapy 命令行工具(command-line tool)或 Scrapy 工具(Scr ...
- SpringBootApplication注解 专题
到这里,看到所有的配置是借助SpringFactoriesLoader加载了META-INF/spring.factories文件里面所有符合条件的配置项的全路径名.找到spring-boot-aut ...
- vim永久显示行号
先复制一份vim配置模板到个人目录下,如果目录不对的,自己找到这个文件 cp /usr/share/vim/vim74/vimrc_example.vim ~/.vimrc 注:redhat的路径为 ...