问题描述:一个带权有向图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. DX11 Without DirectX SDK--06 DirectXMath数学库

    回到 DirectX11--使用Windows SDK来进行开发 xnamath.h原本是位于DirectX SDK的一个数学库,但是现在Windows SDK包含的数学库已经抛弃掉原来的xnamat ...

  2. PAT1017:Queueing at Bank

    1017. Queueing at Bank (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Supp ...

  3. PAT1004:Counting Leaves

    1004. Counting Leaves (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A fam ...

  4. Linux 操作系统基础知识

    1.操作系统总体介绍 •CPU: 就像人的大脑,主要负责相关事情的判断以及实际处理的机制.查询指令: cat /proc/cpuinfo•内存: 大脑中的记忆区块,将皮肤.眼睛等所收集到的信息记录起来 ...

  5. 一次数组越界的bug经历

    数组和指针都是C里面的好东西,但是一旦使用不当,真的会让人抓狂. 下面是写程序时遇到的一次数组越界的经历,感觉对以后写程序有点启发,所以记录下来. 起因: 我想用OLED动态显示一组浮点数,而且浮点数 ...

  6. ORALCE删除临时表空间的方法---解决ORA01033: oralce initialization or shutdown in progress方案

    当一台主机上oralce 临时表空间太多,而又用不到这些临时表空间的时候,    TABLESPACE 会占用大量的存储空间.本文介绍一种删除ORACLE 临时表空间的方法. 一 启动任务管理器.在任 ...

  7. 自动化测试--protractor

    前戏 面向模型编程: 测试驱动开发: 先保障交互逻辑,再调整细节.---by 雪狼. 为什么要自动化测试? 1,提高产出质量. 2,减少重构时的痛.反正我最近重构多了,痛苦经历多了. 3,便于新人接手 ...

  8. MySQL索引及查询优化总结 专题

    小结:db名与应用名相同,表名:业务名_此表的作用 ,表名表示内容,不体现数量,如果表示boolean概念,表名需要使用is_业务含义来表示,但POJO中不应该出现isXXX,因为不方便序列化,中间的 ...

  9. log4j的配置与使用

    配置log4j的步骤如下: 1.导入jar包 如log4j-1.2.15.jar 2.在src下添加log4j.properties 使用时把下面内容中的注释去掉: //日志级别及位置 log4j.r ...

  10. 如何将网页保存为PDF文件

    怎样将网页保存为PDF文件... 问题: 很多时候我们需要将网页上的内容,在排版不变的情况下完整的保存下来,那么用pdf格式是最好的效果了,还图文并茂,效果与真实的网页很相似,如果另存为网页的话,会下 ...