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算法的更多相关文章

  1. 最短路问题---Dijkstra算法学习

    Dijkstra又称单源最短路算法,就从一个节点到其他各点的最短路,解决的是有向图的最短路问题 此算法的特点是:从起始点为中心点向外层层扩展,直到扩展到中终点为止. 该算法的条件是所给图的所有边的权值 ...

  2. 最短路问题 Dijkstra算法- 路径还原

    // 路径还原 // 求最短路,并输出最短路径 // 在单源最短路问题中我们很容易想到,既然有许多条最短路径,那将之都存储下来即可 // 但再想一下,我们是否要把所有的最短路径都求出来呢? // 实际 ...

  3. HDU_1874——最短路问题,Dijkstra算法模版

    Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行 ...

  4. 单源最短路问题 Dijkstra 算法(朴素+堆)

    选择某一个点开始,每次去找这个点的最短边,然后再从这个开始不断迭代,更新距离. 代码: 朴素(vector存图) #include <iostream> #include <cstd ...

  5. 最短路问题之Dijkstra算法

    题目: 在上一篇博客的基础上,这是另一种方法求最短路径的问题. Dijkstra(迪杰斯特拉)算法:找到最短距离已经确定的点,从它出发更新相邻顶点的最短距离.此后不再关心前面已经确定的“最短距离已经确 ...

  6. dijkstra算法解决单源最短路问题

    简介 最近这段时间刚好做了最短路问题的算法报告,因此对dijkstra算法也有了更深的理解,下面和大家分享一下我的学习过程. 前言 呃呃呃,听起来也没那么难,其实,真的没那么难,只要弄清楚思路就很容易 ...

  7. HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题

    参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上:  迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...

  8. [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  9. 最短路径算法之Dijkstra算法(java实现)

    前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...

随机推荐

  1. Centos安装Memcached和(Nginx)Memcache扩展详细教程

    下载memadmin,下载地址:http://www.junopen.com/memadmin/ 并在IIS新建站点. 测试地址:http://wap.yousawang.com/mem , 1.重启 ...

  2. 使用Unity3D的50个技巧

    使用Unity3D的50个技巧 刚开始学习Unity3D时间不长,在看各种资料.除了官方的手册以外,其他人的经验也是非常有益的.偶尔看到老外这篇文章,觉得还不错,于是翻译过来和大家共享.原文地址:ht ...

  3. kindeditor-在线编辑器

    写在前面的话: 今天是第一次写博客,很值得纪念,希望能够和大神们一起交流技术,一起进步...来自<一只有梦想的前端小白> 最近项目中需要实现图文混排的效果,所以研究了下在线编辑器-- ki ...

  4. 利用Canvas实现360度浏览

    前言:最近几个月来到新公司,主要从事移动端方面的开发,有时候也挺忙挺累的,于是就好一段时间没写博客了.其实自己在这几个月里,自己对canvas以及createjs和egret都有了一定程度上的认识与掌 ...

  5. ArcPy之Python介绍

    1.Python简介 Python是一种面向对象.解释型计算机程序设计语言;Python是一种简单易学,功能强大的编程语言.它有高效率的高层数据结构,简单而有效地实现面向对象编程.Python简洁的语 ...

  6. Get item by sharepoint web service jquery

    对于sp2010,在ie浏览器中这个代码无法生效,只有chrome可以生效. //获取附件id function GetAttachments(listName) { var soapEnv = '& ...

  7. wordpress语言切换

    如果你想更改WordPress的语言,比如将英文版转换为中文版,或者将中文版转换为英文版,该如何操作?其实很简单,打开网站根目录下的 wp-config.php,然后搜索 define('WPLANG ...

  8. switch-枚举

    在swift中,如果switch的枚举,可以不写default,因为系统知道有多少种情况,如果不是枚举,必须要写default enum WBComposeToolBarButtonType:Int ...

  9. android加固系列—5.加固前先学会破解,hook(钩子)jni层系统api

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5138585.html] crackme项目jni的关键代码(项目地址见文章底部),获取当前程序 ...

  10. sql 2012 sequence 速记

    CodeSELECT id INTO #t1 FROM sys_id WHERE id < 3 SELECT next value for sequencebase FROM #t1 DROP ...