问题描述:一个带权有向图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. hdu-3071 Gcd & Lcm game---质因数分解+状态压缩+线段树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3071 题目大意: 给定一个长度为n的序列m次操作,操作的种类一共有三种 查询 L :查询一个区间的所 ...

  2. flask模板

    做为python web开发领域的一员,flask跟Django在很多地方用法以都是相似的,比如flask的模板 模板就是服务器端的页面,在模板中可以使用服务端的语法进行输出控制 1.模板的工作原理 ...

  3. python_重写数组

    class MyArray: '''All the elements in this array must be numbers''' def __IsNumber(self,n): if not i ...

  4. 【转】网上看到的“12个非常有用的JavaScript技巧”

    1) 使用!!将变量转换成布尔类型 有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将它们的值视为true.对于做这样的检查,你可以使用!!(双重否定运算符),它能自动将任何类型的数据转 ...

  5. oracle数据库-错误编码大全

    ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件   ORA-00018: 超出最大会话数   ORA-00019: 超出最大会话许可数   ORA-000 ...

  6. How to untar a TAR file using Apache Commons

    import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress ...

  7. JS for循环有关变量类型的问题/魔兽世界样式的tooltip

    <script> var num = 100; for (var i=num-5;i<num+5;i++){ // console.log(typeof(i)); console.l ...

  8. 巩固java(四)----super和super()

    引言: 一个公司里有普通员工和经理,他们之间有很多共同点,但也有一些差异,比如薪水问题,普通员工只有普通工资,经理在完成绩效后有一定比例的奖金.这时我们可以定义两个类Employee和Manager, ...

  9. GraphicsMagick+im4java实现高质量大图的处理

    http://www.open-open.com/lib/view/open1355754261963.html 做网站往往需要处理各种各样的图片,对于jdk自带的一套图片处理库,他的特点是稳定简单, ...

  10. 解决jQuery的$符号的冲突问题

    强大的jQuery框架在设计的时候不仅考虑到自己的符号定义问题,还想到了与其他框架的和平共处问题,(给别人留条路也是写在给自己留路),设计者以博大的胸怀和包罗万象的设计理念赋予了jq顽强的生命力. 废 ...