单源点的最短路径问题:给定带权有向图G和源点V,求从V到G中其余各顶点的最短路径

Dijkstra算法描述如下:

(1)用带权的邻接矩阵arcs表示有向图,arcs[i][j]表示弧<vi,vj>上的权值,若<vi,vj>不存在,则置arcs[i][j]=INF。

vis为已找到从v出发的最短路径的终点集合,它的初始状态为空集。那么,从v出发到图上其余各顶点可能到达的最短路径初值为:

D[i]=arcs[Vex(G,v)][i],vi属于V

(2)选择vj,使得D[j]=Min{D[i]|vi属于V-vis},vj就是当前求得的一条从v出发的最短路径的终点。令vis=vis U {j}

(3)修改从v出发到集合V-vis上任一顶点vk可达的最短路径长度。如果D[j]+arcs[j][k]<D[k],则修改D[k]=D[j]+arcs[j][k]

(4)重复操作(2)、(3)工n-1次。由此求得从v到图上其余各顶点的最短路径是依路径长度递增的序列

//Dijkstra:从某个源点到其余各顶点的最短路径
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define N 500
#define INF 0x3f3f3f3f //1061109567 -- 3*(16^7+16^5+16^3+16)+15*(16^6+16^4+16^2+1)
bool vis[N];//顶点是否已经选入S
int p[N];//前驱顶点
int dis[N];//最短路径
typedef struct graph{
int vexnum;//顶点数
int edgenum;//边数
int arc[N][N];//邻接矩阵
}Graph;
void CreateGraph(Graph* &);
void Dijkstra(Graph*);
void sp(int,int);//最短路
void CreateGraph(Graph* &G)
{
int i,v,w;
memset(G->arc,INF,sizeof(G->arc));//初始化为INF
//printf("%d",G->arc[100][100]);
printf("有向图的顶点数和边数:");
scanf("%d%d",&G->vexnum,&G->edgenum);
printf("有向图顶点序号以及关联权值:");
for(i=;i<G->edgenum;i++)
{
scanf("%d%d",&v,&w);
scanf("%d",&G->arc[v][w]);
}
}
void Dijkstra(Graph *G)
{
int i,v,w,min;
memset(vis,false,sizeof(vis));
memset(p,,G->vexnum);//初始时所有终点的前驱顶点都为始点0
for(i=;i<G->vexnum;i++)//最短路径初始化为始点到终点的直接路径长度
dis[i] = G->arc[][i];
for(i=;i<G->vexnum;i++)//进行G->vexnum-1次循环,按路径递增每次确定一个顶点
{
min = INF;
for(w=;w<G->vexnum;w++)
{
if(!vis[w] && dis[w] <= min)//此处取=号是确保输出 路径时能够显示No Path的顶点
{
v = w;//v保存当前最小路径对应的终点
min = dis[w];
}
}
vis[v] = true;
sp(v,min);//显示最短路径以及长度
for(w=;w<G->vexnum;w++)//更新当前最短路径以及距离
{
if(!vis[w] && min + G->arc[v][w] < dis[w])
{
dis[w] = min + G->arc[v][w];
p[w] = v;
}
}
}
}
void sp(int v,int pow)
{
if(pow == INF)
{
printf("V0--->V%d:No Path\n",v);
}
else{
printf("V0-->V%d最短路径长度为:%d,路径如下:\n",v,pow);
while(v)//从后往前打印,到始点0结束
{
printf("V%d<-",v);
v = p[v];
}
printf("V0\n");
}
}
int main()
{
Graph *G = (Graph *)malloc(sizeof(Graph));
CreateGraph(G);
Dijkstra(G);
return ;
}
// 6 8
// 0 2 10
// 0 4 30
// 0 5 100
// 4 5 60
// 4 3 20
// 3 5 10
// 2 3 50
// 1 2 5

Dijkstra求最短路径的更多相关文章

  1. POJ 2387 Til the Cows Come Home Dijkstra求最短路径

    Til the Cows Come Home Bessie is out in the field and wants to get back to the barn to get as much s ...

  2. POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)

    Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16425   Accepted: 5797 Descr ...

  3. Dijkstra求最短路径&例题

    讲了半天好像也许maybe听懂了一点,先写下来233 先整理整理怎么存(开始绕) 最简单的是邻接矩阵存,但是开到10000*10000就MLE了,所以我们用链式前向星存(据说是叫这个名字吧) 这是个什 ...

  4. 算法-图(1)Dijkstra求最短路径

    数组dist[],是当前求到的顶点v到顶点j的最短路径长度 数组path[]存放求到的最短路径,如path[4]=2,path[2]=3,path[3]=0,则路径{0,3,2,4}就是0到4的最短路 ...

  5. 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径

    自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...

  6. Dijkstra算法求最短路径(java)(转)

    原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...

  7. 求最短路径算法之SPAF算法。

    关于求最短路径: 求最短路径的算法有许多种,除了排序外,恐怕是OI界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra(不能求又负权边的图),接着是Bellman-Ford,它们都可以求出由 ...

  8. NYOJ 1248 海岛争霸(Dijkstra变形——最短路径最大权值)

    题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=1248 描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比 ...

  9. POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你 ...

随机推荐

  1. linux下firefox手工安装flash插件

    1. 前往adobe官网,下载flash安装包.下载.tar.gz安装包即可.2. 解压安装包,得到libflashplayer.so文件3. 新建文件夹,~/.mozilla/plugins4. 拷 ...

  2. winform(无边框窗体与timer)

    一.无边框窗体 1.控制按钮如何制作就是放置可以点击的控件,不局限于使用按钮或是什么别的,只要放置的控件可以点击能触发点击事件就可以了 做的好看一点,就是鼠标移入(pictureBox1_MouseE ...

  3. HTML JavaScript简介

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...

  4. DigitalOcean上SSH Key的创建(附DigitalOcean邀请)

    DigitalOcean是一家云主机商家,最低配置512M内存,20G的SSD,每月只有5刀.半个月前刚刚在这上面买了一个VPS,创建Droplet的时候看见创建SSH Key的时候就有点懵,不知道这 ...

  5. js的alert和confirm美化

    --前言-- window对象的alert和confirm标准方法在不同浏览器的显示效果不太相同,有个相同点是都不是很美观.我们的想法是使用js和css分别仿照它们,提供另一套函数,使在不同浏览器的有 ...

  6. javascript --- 设计模式之单体模式(一)

    单体是一个用来划分命名空间并将一些相关的属性与方法组织在一起的对象,如果她可以被实例化的话,那她只能被实例化一次(她只能嫁一次,不能二婚). 单体模式是javascript里面最基本但也是最有用的模式 ...

  7. ES6--class基本使用

    类定义 ES6完整学习阮老师的ECMAScript6入门. 技术一般水平有限,有什么错的地方,望大家指正. 以前我们使用ES5标准定义一个构造函数的过程如下: function Person(name ...

  8. thinkPHP学习笔记(2)

    1.调试模式 设置调试模式部分代码如下: <?php define('APP_DEBUG',TRUE); // 开启调试模式 常量定义代码 require '/ThinkPHP框架所在目录/Th ...

  9. SQL语句的简单使用

    首先要先引入libsqlite3.0.tbd框架 DataBaseHandle.h #import <Foundation/Foundation.h> @interface DataBas ...

  10. iOS 杂笔-21(self.name = “object” 和 _name =”object” 有什么不同?)

    iOS 杂笔-21(self.name = "object" 和 _name ="object" 有什么不同?) 问题如题,这是考察对属性与变量的了解而已. s ...