最短路径算法之Dijkstra算法

闲话不说,正题走起
Dijkstra算法是一个单源点路径算法,要求:图中不存在负权值边

1、算法思路:

a. 初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即: U={其余顶点},若v与U中顶点u有边,则u的距离设置为相应的权值,若u v之间不存在边,则 设置u的距离为无穷大。

b. 从U中选取一个距离 v 最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

c. 以k为新考虑的中间点,修改U中各顶点的距离;若从源点 v 到顶点 u 的距离(经过顶点 k)比原来距离(不经过顶点 k)短,则修改顶点u的距离值,修改后的距离值为顶点 k 的距离加上边<k v>的权值。

d. 重复步骤b和c直到所有顶点都包含在S中。

2、代码

#include<stdio.h>
  
#define SIZE 110  
#define INF 1000000;  
 
int map[SIZE][SIZE];  //邻接矩阵存储 
int len[SIZE];      //len[i]表示源点到i这个点的距离 
int visit[SIZE];  //节点是否被访问 
int n,m;            
 
int dijkstra(int from, int to){ //从源点到目标点 
    
    int i;  
    
    for(i = 1 ; i <= n ; i ++){ //初始化 
        visit[i] = 0;   //一开始每个点都没被访问 
        len[i] = map[from][i];  //先假设源点到其他点的距离 
    }  
  
    int j;  
    for(i = 1 ; i < n ; ++i){   //对除源点的每一个点进行最短计算 
        int min = INF;  //记录最小len
        int pos;  //记录小len 的点 
  
        for(j = 1 ; j <= n ; ++j){  
            if(!visit[j] && min > len[j]){  
                pos = j;  
                min = len[j];  
            }  
        }  
        visit[pos] = 1;  
  
        for(j = 1 ; j <= n ; ++j){
            if(!visit[j] && (len[j] > (len[pos] +map[pos][j]))){ //如果j节点没有被访问过&&j节点到源节点的最短路径>pos节点到源节点的最短路径+pos节点到j节点的路径  
                len[j] = len[pos] + map[pos][j];    //更新j节点到源节点的最短路径    
            }  
        }  
    }  
  
    return len[to];
}
  
  
int main () {  
 
    int i,j;  
    
  //  scanf("%d%d",&n,&m);  //输入数据
    n = 6;  //测试数据 
    m = 9;
 
    for(i = 1 ; i <= n ; ++i){  //设一开始每个点都不可达 
        for(j = 1 ; j <= n ; ++j){  
            map[i][j] = INF;  
        }  
    }  
    
/*  int a,b,c;  //输入数据 
    for(i = 1 ; i <= m ; ++i){  
        scanf("%d%d%d",&a,&b,&c);  
        map[a][b] = map[b][a] = c;  
    }  */
    
    map[1][2] = 7;  //测试数据 
    map[1][3] = 9;
    map[1][6] = 14;
    map[2][3] = 10;
    map[2][4] = 15;
    map[3][6] = 2;
    map[5][6] = 9;
    map[4][5] = 6;
    map[3][4] = 11;
    int temp = INF;
    for(i = 1 ; i <= n ; ++i){
        for(j = 1 ; j <= n ; ++j){
            if(map[i][j] == temp)
                map[i][j] = map[j][i];
        }
    }
 
    int ans = dijkstra(1,5);  
 
    printf("%d",ans);  
 
    return 0;  
} 
 
/*  边的数据 
1 2 7
1 3 9
1 6 14
2 3 10
2 4 15
3 6 2
5 6 9
4 5 6
3 4 11
*/

欢迎大家关注我的公众号


半亩房顶
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 参见贪心算法——最短路径Dijkstra算法参见动态规划 目录 0.最短路径问题0.1 最短路径问题描述 0.1....
    王侦阅读 4,816评论 1 9
  • 1. 图的定义和基本术语 线性结构中,元素仅有线性关系,每个元素只有一个直接前驱和直接后继;树形结构中,数据元素(...
    yinxmm阅读 5,454评论 0 3
  • 1736年,瑞士数学家Euler(欧拉)在他的一篇论文中讨论了格尼斯七桥问题,由此诞生了一个全新的数学分支——图论...
    不困于情阅读 4,402评论 0 9
  • 一、定义 在一幅加权有向图中,最短路径是指从顶点s到顶点t的最短路径是所有从s到t的路径中的权重最小者。求解最短路...
    null12阅读 2,465评论 0 4
  • 早上在关掉手机闹钟的时候,“迫不及待”地翻阅了一下微信(因为给自己定了规矩,晚上10点后尽量就不去看手机了),阅读...
    木华益阅读 286评论 2 7