单源点的最短路径问题:给定带权有向图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. php正规则表达式学习笔记(几个常用函数的区别)

    preg_mache()函数和 preg_mache_all()函数的区别: preg_mache()只会匹配规则中的字符一次, preg_mache_all()会匹配符合条件的所有字符! 例子对比: ...

  2. play HTTP路由 http://play-framework.herokuapp.com/zh/routes#syntax

    HTTP路由 HTTP路由(译者注:Play的路径映射机制)组件负责将HTTP请求交给对应的action(一个控制器Controller的公共静态方法)处理. 对于MVC框架来说,一个HTTP请求可以 ...

  3. oGrid 介绍如何从 server 取的资料

    接着前次 oGrid 初探,其中有介绍如何操作local 资料,本次介绍如何从 server 取的资料. 依照 MVC 架构原理以及一条小龙本身经验来看,一个好的架构,必须要有着分工明确的设计层次,让 ...

  4. 在Java中调用C

    在Java代码中通过JNI调用C函数的步骤如下: 第一步:编写Java代码 第二步:编译Java代码(javac Java文件) 第三步:生成C代码头文件(javah java类名,自动生成) 第四步 ...

  5. SharePoint部署工具SPSD

    SharePoint Solution Deployer,绝对属于必备的SharePoint工具之一了. 下载,解压这个工具,会有如下的目录(没有Assemblies和DeployGAC.bat)解压 ...

  6. SCOM Visio监控 与sharepoint 2010 整合

    激活sharepoint 2010的企业版网站功能 在sharepoint 前端服务器安装:OpsMgrDataModule.msi,安装好后可以看到如下东东: 在Sharepoint前端服务器中启动 ...

  7. Static Cell-静态TableView

    使用静态TableView有两个前提,1.要在Storyboard上  2.需要使用TableViewController PS:如果需要设置不同的cell的高度不同的话,还是需要使用tableVie ...

  8. 【读书笔记】iOS-属性列表

    一,在Cocoa中,有一类名为属性列表的对象,常简写为plist.这些列表包含Cocoa知道如何操作的一组对象.具体来讲,Cocoa如何知道将这们保存在文件中并进行加载.属性列表类包括NSArray, ...

  9. OC中几种集合的遍历方法(数组遍历,字典遍历,集合遍历)

    // 先分别初始化数组.字典和集合,然后分别用for循环.NSEnumerator枚举器和forin循环这三个方法来实现遍历 NSArray *array = @[@"yinhao" ...

  10. 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。

    一.第一种写法 package com.pb.demo1; import java.util.Scanner; /** * 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字. ...