首页 > 编程语言 >Dijkstra最短路径算法

Dijkstra最短路径算法

时间:2022-10-31 18:56:47浏览次数:61  
标签:int 源点 算法 最短 Dijkstra 数组 节点 1000

概念

是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止 百度

时间

\(O(N^2)\)

代码实现

思想:对于连通图,先创建访问节点,图转临界矩阵,由源点到目标节点,每次在数组中变量
如果是

  • 源点假设为1号,建立数组{0,5,8,M,M}其中M表示很大,以为和源点不直接联通
  • 然后在数组中选出和源点最近的点,这里是2点,在以2为源点,并且标记数组2号为已经 访问更新数组{0,5,6,8,7}...
#include<stdio.h>
#include<stdlib.h>
#define max1 10000000  //原词条这里的值太大,导致溢出,后面比较大小时会出错
int a[1000][1000];
int d[1000];//d表示源节点到该节点的最小距离
int p[1000];//p标记访问过的节点
int i, j, k;
int m;//m代表边数
int n;//n代表点数
int main()
{
    scanf("%d%d",&n,&m);
    int    min1;
    int    x,y,z;
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        a[x][y]=z;
        a[y][x]=z;
    }
    for( i=1; i<=n; i++)
        d[i]=max1;
    d[1]=0;
    for(i=1;i<=n;i++)
    {
        min1 = max1;
        //下面这个for循环的功能类似冒泡排序,目的是找到未访问节点中d[j]值最小的那个节点,
        //作为下一个访问节点,用k标记
        for(j=1;j<=n;j++)
            if(!p[j]&&d[j]<min1)
            {
                min1=d[j];
                k=j;
            }
        //p[k]=d[k]; // 这是原来的代码,用下一 条代码替代。初始时,执行到这里k=1,而d[1]=0
       //从而p[1]等于0,这样的话,上面的循环在之后的每次执行之后,k还是等于1。
        p[k] = 1; //置1表示第k个节点已经访问过了
        for(j=1;j<=n;j++)
            if(a[k][j]!=0&&!p[j]&&d[j]>d[k]+a[k][j])
                d[j]=d[k]+a[k][j];
    }
    //最终输出从源节点到其他每个节点的最小距离
    for(i=1;i<n;i++)
        printf("%d->",d[i]);
    printf("%d\n",d[n]); 
    return 0;
}

参考

博客园

标签:int,源点,算法,最短,Dijkstra,数组,节点,1000
From: https://www.cnblogs.com/tsqo/p/16845353.html

相关文章

  • 实验二:逻辑回归算法实验
    实验二:逻辑回归算法实验|博客班级|https://edu.cnblogs.com/campus/czu/classof2020BigDataClass3-MachineLearning||----|----|----||作业要求|https://edu.cnblogs.co......
  • PHP 动态规划算法
    动态规划实现背包问题题目假设6个物品最大容量10重量分别是【4,2,6,5,3】价值分别【6,3,5,4,6】算法利用贪心思路准备准备10个桶【0,0,0,0,0,0,0,0,0......
  • 常见排序算法总结(不详细)
    常见的排序算法有如下几种:插入排序直接插入排序折半插入排序希尔排序选择排序简单选择排序堆排序交换排序冒泡排序快速排序二路归并排序基数排序外部排序直接插......
  • 传统图像分割算法-基于区域的分割算法
    这类方法按照图像的相似性准则划分不同的区域块。其中较为典型的方法优:种子区域生长法、分水岭法、区域分裂合并法。种子区域生长法:首先通过一组表示不同区域的种子像素开......
  • 随机化算法解决圆排列问题 - python解法
    问题描述给定n个大小不等的圆,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n=3,且所给......
  • 字符串匹配算法-Sunday
    以往不论是上课还是各种资料书上,看到关于字符串匹配的算法,大抵都是KMP了。然而KMP的next数组理解起来颇为费劲,且容易忘记。在LeetCode刷题中偶然发现了一个叫Sunday的算法,不......
  • 算法竞赛中的小球放盒子问题
    背景:写题的时候遇到过很多关于这类问题的变种题,所以打算总结一下问题分类根据球是否不同,盒子是否不同,盒子是否为空,一共可以分为\(2^{3}\)种情况讨论Problem1题意......
  • Diff算法(面试)
    Diff算法探讨的就是虚拟DOM树发生变化后,生成DOM树更新补丁的方式。对比新旧两株虚拟DOM树的变更差异,将更新补丁作用于真实DOM,以最小成本完成视图更新。 具体流......
  • 第四届全国大学生算法设计与编程挑战赛(秋季赛)正式赛题解
    没时间写题解了,随便写两笔吧,看不懂可以联系QQ160042137901(Easy)直接暴力枚举每个状态及其所有转移,时间复杂度\((T2^nn^2)\)。02(Easy)二分答案,用一个单调队列或者优先......
  • 算法导论(第23章 最小生成树)
    目录23.1最小生成树的形成23.2\(Kruskal\)算法和\(Prim\)算法\(Kruskal\)算法\(Prim\)算法问题描述:对于一个连通无向图\(G=(V,E)\),为其每条边\((u,v)\inE\),赋予权......