最短路问题Dijkstra算法
Dijkstra算法可以解决源点到任意点的最短距离并输出最短路径
准备:
建立一个距离数组d[ n ],记录每个点到源点的距离是多少
建立一个访问数组v[ n ],记录每个点是否被访问到
建立一个祖先数组p[ n ],记录每个节点的父亲节点是什么
选择一个起始点s
执行:
1初始化:所有点到源点的距离都是无穷大
2访问源点,源点到源点的距离自然就变成0,更新与源点相邻的点的距离数组(等于边的权值)
3加入距离最小的点到已访问集合,更新与已访问集合连接的点的距离数组(=min{ 直接距离, 间接距离})以及更新祖先节点数组p[ n ]
4重复步骤3,直到寻找到终点或者访问完所有节点
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 100
#define INF 999
int graph[max][max];
int vertex_num;
int edge_num;
int d[max];
int v[max];
int p[max]; Dijkstra(int s){
int i,j,k;
//init part
for(i=;i<vertex_num;i++){
if(graph[s][i]!=){ //if vertex i next to source vertex s
d[i]=graph[s][i];//update the distance array
p[i]=s;
v[i]=;
}else{
d[i]=INF;
p[i]=-;
v[i]=;
} }
d[s]=;
p[s]=;
v[s]=; for(i=;i<vertex_num;i++){
int min=INF;
int u;
for(j=;j<vertex_num;j++){ //find the shortest distance vertex form all the unvisited vertex
if(v[j]==&&d[j]<min){
min=d[j]; //mini distance
u=j; //mini distance vertex u
}
}
v[u]=; //visit u
for(k=;k<vertex_num;k++){
if(v[k]==&&graph[u][k]>&&d[u]+graph[u][k]<d[k]){ //graph[u][k]>0 make sure u and k are connected;
d[k]=d[u]+graph[u][k];
p[k]=u;
}
}
}
printf("Shortest distance form %d:\n",s);
for(i=;i<vertex_num;i++){
printf("%d ",d[i]);
}
printf("\n\n");
}
void show_path(int s,int d){
int cur=d;
int tmp[vertex_num]; int i=;
while(cur!=s){
tmp[i++]=cur;
cur=p[cur];
}
tmp[i]=s;
printf("The shortest path:\n");
while(i>){
printf("%d ->",tmp[i]);
i--;
}
printf("%d",tmp[i]);
}
int main(){
int i,j;
FILE *fin = fopen ("dij.in", "r");
FILE *fout = fopen ("dij.out", "w"); char buf[];
fgets(buf,,fin);
edge_num=atoi(buf); printf("edge_num:%d\n",edge_num);
fgets(buf,,fin);
vertex_num=atoi(buf); printf("vertex_num:%d\n",vertex_num); for(i=;i<edge_num;i++){
int start,end,weight;//start point,end point and the weight of edge
fgets(buf,,fin);
sscanf(buf,"%d %d %d",&start,&end,&weight); printf("start:%d end:%d weight:%d\n",start,end,weight);
graph[start][end]=weight;//init the graph matrix no direct } printf("\n");
printf("Graph matrix:\n");
for(i=;i<vertex_num;i++){
for(j=;j<vertex_num;j++){
printf("%-5d",graph[i][j]);
}
printf("\n");
}
printf("\n");
Dijkstra();
show_path(,);
return ;
}
最短路问题Dijkstra算法的更多相关文章
- 最短路问题---Dijkstra算法学习
Dijkstra又称单源最短路算法,就从一个节点到其他各点的最短路,解决的是有向图的最短路问题 此算法的特点是:从起始点为中心点向外层层扩展,直到扩展到中终点为止. 该算法的条件是所给图的所有边的权值 ...
- 最短路问题 Dijkstra算法- 路径还原
// 路径还原 // 求最短路,并输出最短路径 // 在单源最短路问题中我们很容易想到,既然有许多条最短路径,那将之都存储下来即可 // 但再想一下,我们是否要把所有的最短路径都求出来呢? // 实际 ...
- HDU_1874——最短路问题,Dijkstra算法模版
Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行 ...
- 单源最短路问题 Dijkstra 算法(朴素+堆)
选择某一个点开始,每次去找这个点的最短边,然后再从这个开始不断迭代,更新距离. 代码: 朴素(vector存图) #include <iostream> #include <cstd ...
- 最短路问题之Dijkstra算法
题目: 在上一篇博客的基础上,这是另一种方法求最短路径的问题. Dijkstra(迪杰斯特拉)算法:找到最短距离已经确定的点,从它出发更新相邻顶点的最短距离.此后不再关心前面已经确定的“最短距离已经确 ...
- dijkstra算法解决单源最短路问题
简介 最近这段时间刚好做了最短路问题的算法报告,因此对dijkstra算法也有了更深的理解,下面和大家分享一下我的学习过程. 前言 呃呃呃,听起来也没那么难,其实,真的没那么难,只要弄清楚思路就很容易 ...
- HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上: 迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...
- [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
- 最短路径算法之Dijkstra算法(java实现)
前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...
随机推荐
- Weex 环境搭建(win7)
安装 Node.js node.js需要4.0+ 百度云下载地址http://pan.baidu.com/s/1o84g6c6 官网下载地址https://nodejs.org/en/ 安装教程请看这 ...
- mysql行转列、列转行示例
最近在开发过程中遇到问题,需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示. 借此机会,在网上查阅了相关方法,现总结出一种比较简单易懂的方法备用. ...
- javascript 对象初探(二)--- 返回对象的函数
除了使用new操作符调用构造函数以外,我们也可以抛开new操作符,只用一般函数来创建对象,这样就能执行某些预备工作,并已对象为返回值的函数.. function her(){ return { nam ...
- 谈谈GIS与地理学语言
二十一世纪初,也就是我们这代人生活的昨天和今天,伴随着"空间觉醒",GIS逐渐被人们所熟知.以地学原理为依托的地理信息系统,在学术界被称为是第三代地理学语言.这个概念首先是由号称是 ...
- Android Content Provider基础
Android Content Provider基础 Content Providers Content providers管理对一个结构化的数据集合的访问.它们封装了数据,并且提供了保护数据安全性的 ...
- <转>最新版SDWebImage的使用
我之前写过一篇博客,介绍缓存处理的三种方式,其中最难,最麻烦,最占内存资源的还是图片缓存,最近做的项目有大量的图片处理,还是采用了SDWebImage来处理,但是发现之前封装好的代码报错了.研究发现, ...
- 你真的了解UIButton、UILabel 吗?
一:首先查看一下关于UIButton的定义 @class UIImage, UIFont, UIColor, UIImageView, UILabel; //设置UIButton的样式 typedef ...
- 移动Web开发(一)
1.浅谈Web标准 降低开发复杂度,覆盖的技术层面十分广泛,技术标准化. 以HTML为核心,扩展出几个大类的技术标准: a.程序访问: ECMAScript(ES) 3 . ES 5 . ES ham ...
- NSString 字符串替换
NSString * oneScale=@"@ddd"; NSLog(@"%@",[oneScale stringByReplacingOccurrencesO ...
- 体验最火的敏捷——SCRUM(厦门,2014.1.4)
1.概述SCRUM是当前最火的一种敏捷开发方法,有用户故事.冲刺.燃尽图等很多很酷的玩法,有牛B的产品负责人.SCRUM Master,有超强的自组织团队.本沙龙将为您展现当前最火最酷的敏捷开发方法! ...