问题描述:一个带权有向图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算法的更多相关文章

  1. 最短路径-Dijkstra算法与Floyd算法

    一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2   ADCE:3   ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...

  2. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  3. 有向网络(带权的有向图)的最短路径Dijkstra算法

    什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...

  4. Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  5. 网络最短路径Dijkstra算法

    最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...

  6. 单源最短路径Dijkstra算法,多源最短路径Floyd算法

    1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...

  7. 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms           Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  8. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  9. 最短路径—Dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

随机推荐

  1. HBuilder 打包流程

    1.运行HBuilder---百度搜索HBuilder,官网下载安装包,解压,运行HBuilder.exe.注册账号,并登陆 2.新建app---在左边右键,选择新建APP,或者,点击中间的新建app ...

  2. centOS7固定IP

    接续安装完成centOS虚拟机后,重启完成后,会出现如下的界面: 这里,我们使用root帐号和已配置的root密码进行登陆,登陆完成后,输入如下命令,运行结果如下图: dhclient 通过上述命令, ...

  3. Rabbit MQ 延迟插件rabbitmq_delayed_message_exchange的使用

    环境: windows server 2008 R2 rabbitmq 3.7.2 下载插件: http://www.rabbitmq.com/community-plugins.html 注意要下载 ...

  4. goroutine和线程区别

    从调度上看,goroutine的调度开销远远小于线程调度开销. OS的线程由OS内核调度,每隔几毫秒,一个硬件时钟中断发到CPU,CPU调用一个调度器内核函数.这个函数暂停当前正在运行的线程,把他的寄 ...

  5. facenet 进行人脸识别测试

    1.简介:facenet 是基于 TensorFlow 的人脸识别开源库,有兴趣的同学可以扒扒源代码:https://github.com/davidsandberg/facenet 2.安装和配置 ...

  6. Oracle-13:Oracle中的表分区

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客记录了表分区 表分区的含义: 典型的拿空间换时间的案例! 表分区对一张表进行分区,分区之后表中的数据存 ...

  7. 在Windows下同时安装Python2.x和Python3.x

    前言: Python现在是两个版本共存,Python2.x和Python3.x都同时在更新.但是Python2.x和Python3.x的区别还是很多的(以后我可能会写一篇文章列举一下Python2.x ...

  8. Hibernate验证器

    第 4 章 Hibernate验证器  http://hibernate.org/validator/documentation/getting-started/#applying-constrain ...

  9. 使用Spring MVC测试Spring Security Oauth2 API

    不是因为看到希望了才去坚持,而坚持了才知道没有希望. 前言 在Spring Security源码分析十一:Spring Security OAuth2整合JWT和Spring Boot 2.0 整合 ...

  10. 用Hyperledger Fabric(超级账本)来构建Java语言开发区块链的环境

    面向 Java 开发人员的链代码简介 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger Fabric v0.6 来构 ...