Dijkstra求最短路径
单源点的最短路径问题:给定带权有向图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求最短路径的更多相关文章
- 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 ...
- POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16425 Accepted: 5797 Descr ...
- Dijkstra求最短路径&例题
讲了半天好像也许maybe听懂了一点,先写下来233 先整理整理怎么存(开始绕) 最简单的是邻接矩阵存,但是开到10000*10000就MLE了,所以我们用链式前向星存(据说是叫这个名字吧) 这是个什 ...
- 算法-图(1)Dijkstra求最短路径
数组dist[],是当前求到的顶点v到顶点j的最短路径长度 数组path[]存放求到的最短路径,如path[4]=2,path[2]=3,path[3]=0,则路径{0,3,2,4}就是0到4的最短路 ...
- 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
- Dijkstra算法求最短路径(java)(转)
原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...
- 求最短路径算法之SPAF算法。
关于求最短路径: 求最短路径的算法有许多种,除了排序外,恐怕是OI界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra(不能求又负权边的图),接着是Bellman-Ford,它们都可以求出由 ...
- NYOJ 1248 海岛争霸(Dijkstra变形——最短路径最大权值)
题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=1248 描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比 ...
- POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你 ...
随机推荐
- Scala on Visual Studio Code
Download and install Scala Download a scala installation package from here. Then install it. Linux s ...
- 使用正则表达式获取Sql查询语句各项(表名、字段、条件、排序)
string text = "select * from [admin] where aa=1 and cc='b' order by aa desc "; Regex reg = ...
- SQL数据库基础(五)
字符串函数: 时间日期函数: SELECT @@DATEFIRST AS '1st Day', DATEPART(dw, GETDATE()) AS 'Today' SELECT GETDATE() ...
- 一个H5的3D滑动组件实现(兼容2D模式)
起由 原始需求来源于一个项目的某个功能,要求实现3D图片轮播效果,而已有的组件大多是普通的2D图片轮播,于是重新造了一个轮子,实现了一个既支持2D,又支持3D的滑动.轮播组件. 实现思路 刚一开始肯定 ...
- mongodb c#语法基础
这里采用的是mongoDB官网推荐使用.net驱动: http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_to ...
- SAP中获取当前用户相关信息的两个函数
函数名:TH_USER_LIST作用:可以得到SM04界面显示样式的表. 函数名:TH_USER_INFO作用:可以得到当前特定用户的机器名.当前活动窗口数.IP地址等信息
- android view holder 优化
android 一般都用viewholder来优化contentView,采用sparseArray能够进一步优化 /** * 用法: ImageView bananaView = ViewHolde ...
- 结合源代码详解android消息模型
Handler是整个消息系统的核心,是Handler向MessageQueue发送的Message,最后Looper也是把消息通知给Handler,所以就从Handler讲起. 一.Handler H ...
- nutch简介
1.什么是 nutch Nutch 是一个开源的. Java 实现的搜索引擎.它提供了我们运行自己的搜 索引擎所需的全部工具.2.研究 nutch 的原因(1) 透明度: nutch 是开放源代码的, ...
- 【读书笔记】iOS-GCD-API
一,Dispatch Queue dispatch_async(queue, ^{ /* *想执行的任务 */ }); 其中queue分为两种: 1,Serial Dispatch Queue 等待现 ...