前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >单源最短路径算法——Dijkstra算法

单源最短路径算法——Dijkstra算法

作者头像
RainMark
发布于 2019-09-10 11:46:51
发布于 2019-09-10 11:46:51
1.1K00
代码可运行
举报
文章被收录于专栏:RainMark 的文章RainMark 的文章
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define MAXN (10001)
#define INF  (1<<16)

typedef struct _Vertex
{
    int w[MAXN];
    int cw;
    int know;
    int dis;
    int path;
    int ew[MAXN]; /*The edge weight of curent vertex to w[i] */
    
}Graph;

Graph G[MAXN];

int read_graph ( void )
{
    int i, k;
    int n, m, ew;
    
    scanf ("%d", &n );
    for ( i = 0 ; i < n; i++ ) {
        scanf ("%d", &m ); G[i].cw = m; G[i].know = 0; G[i].dis = INF; G[i].path = -1;
        for ( k = 0; k < m; k++ ) scanf ("%d%d", &G[i].w[k], &G[i].ew[k] );
    }
    
    return n;
}

int find ( int n )
{
    int i;
    int m;
    
    for ( m = -1, i = 0; i < n; i++ ) if ( !G[i].know ) { m = i; break; }
    if ( m < 0 ) return -1;
    
    for ( i = m + 1; i < n; i++ ) {
        if ( !G[i].know ) {
            if ( G[i].dis < G[m].dis ) m = i;
        }
    }
    return m;
}

void dijst ( int v , int n)
{
    int i, k;
    int min;
    int *w = NULL;
    int cw;
    
    G[v].dis = 0;
    
    while (1) {
        min = find ( n );
        if ( min < 0 ) {  /*Have no vertex to continue*/
            break;
        }
        
        G[min].know = 1;
        w = G[min].w; cw = G[min].cw;
        for ( i = 0; i < cw; i++ ) {
            if ( !G[ w[i] ].know ) {
                if ( G[min].dis + G[min].ew[i] < G[ w[i] ].dis ) { 
                    G[ w[i] ].dis = G[min].dis + G[min].ew[i];
                    G[ w[i] ].path = min;
                }
            }     
        }
    }
}

void print_path ( int v )
{
    if ( G[v].dis > 0 ) {
        print_path ( G[v].path );
        printf ("->v%d", v + 1 );
    } else 
        printf ("v%d", v + 1 );
}

int main(int argc, char *argv[])
{
    int n;
    int i;
    
    freopen ( "data.txt" , "r" , stdin );
    n = read_graph ();
    dijst ( 0 , n );

    for ( i = 0; i < n; i++ ) { 
        print_path ( i );
        printf("\n");
    }
    return 0;
}

输入数据:

7 2 1 2 3 1 2 3 3 4 10 2 5 5 0 4 4 2 2 4 2 5 8 6 4 1 6 6 0 1 5 1

参考书籍:数据结构与算法分析(C语言描述第二版)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-12-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Dijkstra算法--单源最短路径
在http://blog.csdn.net/hacker_zhidian/article/details/54898064这一篇博客中总结了一下在求图的最短路中的一个算法-Floyd算法,Floyd算法用于求图的多源最短路径(多源最短路径:图的所有顶点到其他顶点的最短路径),时间复杂度和其他求最短路算法相比较高,如果一些题目只要求求单源最短路径(单源最短路径:图的某个顶点到其他顶点的最短路径)的话,Floyd算法显然不是最好的选择,那么今天我们来看一下另一个用于求单源最短路径的算法:Dijkstra算法。
指点
2019/01/18
2.6K0
Dijkstra算法--单源最短路径
[模板] Dijkstra单源最短路径
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139191.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/02
2570
最短路径算法–无向图[通俗易懂]
Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法。该算法被称为是“贪心算法”的成功典范。
全栈程序员站长
2022/09/01
1.1K0
最短路径算法–无向图[通俗易懂]
最短路专题(最全面详细解决最短路问题的一篇博文)
2.首先我们知道在给这个mapt初始化时在主对角线上的元素,及 i == j ,表示的是从自身到自身,那么我们自然要给其初始化为0, 其余的我们统统看成没有路,即为INF。
杨鹏伟
2020/09/11
4520
P3371 【模板】单源最短路径
题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。 输入输出格式 输入格式: 第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。 接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。 输出格式: 一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647) 输入输出样例 输入样例#1: 4 6
attack
2018/04/13
7130
P3371 【模板】单源最短路径
Dijkstra-单源最短路径算法
  Dijkstra算法用来计算一个点到其他所有点的最短路径的算法,是一种单源最短路径算法。也就是说,只能计算起点只有一个的情况。
别团等shy哥发育
2023/03/15
9560
Dijkstra-单源最短路径算法
最短路径算法(下)——弗洛伊德(Floyd)算法
在这篇博客中我主要讲解最短路径算法中的Floyd算法,这是针对多源最短路径的一个经典算法。对于单源最短路径算法请详见我的另一篇博客:最短路径算法(上)——迪杰斯特拉(Dijikstra)算法
AI那点小事
2020/04/20
8890
最短路径算法(下)——弗洛伊德(Floyd)算法
数据结构与算法-求最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径,它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
越陌度阡
2020/11/26
1.1K0
数据结构与算法-求最短路径之迪杰斯特拉(Dijkstra)算法
四种常用最短路径算法模板
转自:http://www.cnblogs.com/genyuan/archive/2013/05/01/3053904.html
forrestlin
2022/04/02
4080
hdu 3631 Shortest Path(Floyd)[通俗易懂]
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
全栈程序员站长
2022/07/10
1930
弗洛伊德(Floyd)算法求图的最短路径「建议收藏」
弗洛伊德算法作为求最短路径的经典算法,其算法实现相比迪杰斯特拉等算法是非常优雅的,可读性和理解都非常好。
全栈程序员站长
2022/09/05
4540
图论-单源最短路径(Dijskal算法)
Dijkstra算法应用了贪心的思想,即“抄近路走”。维护两个集合A和B,A表示已确定最短路径的结点集(红色表示), B表示邻居结点(蓝色表示)。
唔仄lo咚锵
2020/10/23
9650
原 初学图论-DAG单源最短路径算法
    当图中没有环时,使用Bellman-Ford这一低效算法显然就不划算了,这时我们可以选择DAG算法。     本文使用C++实现了这一基本算法。参考《算法导论》第24.2节     笔者使用了vector实现邻接链表,以提高运行效率。 /**  * DAG's Single Source Shortest Path Algorithm in C++  * Based on DFS, don't let any circle exist in the graph  * Time Cost : O(|
不高不富不帅的陈政_
2018/05/18
9700
图论-多源最短路径(Floyd算法)
分析: 给定若干双向正值边和单向负值边,问是否存在负圈(使其时光倒流回到原点)。 所以在第二重循环,求完第i个结点后判断。
唔仄lo咚锵
2020/10/16
6160
图论-多源最短路径(Floyd算法)
HDU3790 最短路径问题(dijkstra+思维)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790        其实就是裸的dij,只不过加了一个数组用来存花费,而且需要注意的是因为要求最短路程
Ch_Zaqdt
2019/01/11
6930
洛谷P4779 【模板】单源最短路径(标准版)
前几天写dijkstra的时候没打vis标记居然A了,然后天真的我就以为Dijkstra不用打标记。
attack
2018/07/27
5440
最短路径问题—Dijkstra算法详解
前言 Nobody can go back and start a new beginning,but anyone can start today and make a new ending. Name:Willam Time:2017/3/8
全栈程序员站长
2022/09/05
9800
Floyd —Warshall(最短路及其他用法详解)
多元都求出来了,单源的肯定也能求。 思想是动态规划的思想:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们易写出状态转移方程Dis(AB) =min(Dis(AX) + Dis(XB) ,Dis(AB))这样一来,当我们遍历完所有节点X,Dis(AB)中记录的便是A到B的最短路径的距离。
风骨散人Chiam
2020/10/28
5390
Floyd —Warshall(最短路及其他用法详解)
单源最短路径dijkstra算法_dijkstra是谁
酋长说:”嗯,如果你能够替我弄到大祭司的皮袄,我可以只要 8000 金币。如果你能够弄来他的水晶球,那么只要 5000 金币就行了。”
全栈程序员站长
2022/09/22
7340
SPF单源最短路径算法
SPF(shortest path first)算法也叫Dijkstra(迪杰斯特拉)算法,由上个世纪的计算机科学家狄克斯特拉提出,是离散数学中一种经典高效的网络(连通图)最短路径寻路算法.指定一个源点,求出到其余各个顶点的最短路径,也叫”单源最短路径”.
Jean
2021/09/12
2.2K0
SPF单源最短路径算法
相关推荐
Dijkstra算法--单源最短路径
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文