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. html 网页文本设计

    1.文本的排版 1.1 <body> <h2>李白</h2> <p align="center" > <font face=& ...

  2. Hybrid框架UI重构之路:六、前端那点事儿(Javascript)

    上文回顾 :Hybird框架UI重构之路:五.前端那点事儿(HTML.CSS) 这里讲述在开发的过程中,一些JS的关键点. 换肤 对于终端的换肤,我之前一篇文章有说了我的想法. 请查看:http:// ...

  3. ae动态显示属性表————切记DataTable中要先Add(row)之后再往里传值。

    public partial class FrmAttributeTable : Form { private AxMapControl m_MapCtl; public FrmAttributeTa ...

  4. C#的3DES加密解密算法

    C#类如下: using System; using System.Collections.Generic; using System.Text; using System.Security.Cryp ...

  5. arcmap Command

    The information in this document is useful if you are trying to programmatically find a built-in com ...

  6. SharePoint Online 创建门户网站系列之创建栏目

    前 言 SharePoint Online的栏目,简单描述即显示在首页上的各个模块信息,这里,我们主要介绍我们首页上的栏目,包括简介类型.新闻列表类型.图片类型: 下面,让我们开始在SharePoin ...

  7. LBS上传到百度地图

    准备: 第一步:注册百度地图开发者账号 第二步:使用开发者账号注册相对应秘钥 在LBS后台添加所需要上传的字段 1,添加WebClientHelper帮助类 2,LBS帮助类 private stri ...

  8. mac os intellij如何快路查看一个java类的所有方法,结构

    如果是自己写的java类,点击点击导航的project-setting-show members 如果是系统库的,点击structure 再点一下lib中的类,或者快捷键 command+F12

  9. iOS开发和localStorage/sessionStorage

    一.前言 在近期的工作中,有前端同学告诉我要清除localStorage,我当时对localStorage完全没有概念,所以就在w3c看了一下相关的内容,下面简单的介绍一下.算是对iOS开发者普及H5 ...

  10. apache 虚拟ip

    参考 http://blog.sina.com.cn/s/blog_5d8ca1e90100hnpv.html <VirtualHost 127.0.0.1:80>      Docume ...