[临时]单源最短路径(Dijkstra算法)

简介:   因为没有原创内容,相当于看书笔记,因此本打算发在QQZone,但因为QQ空间日志忽然服务器繁忙,大骂腾讯无奈还是把此日志临时发布在自己的博客上。  参考资料:《计算机算法设计与分析》(第三版)。  条件:  (1)带权有向图 G = (V, E); 任意边的权 >= 0;  算法:  贪心法。

  因为没有原创内容,相当于看书笔记,因此本打算发在QQZone,但因为QQ空间日志忽然服务器繁忙,大骂腾讯无奈还是把此日志临时发布在自己的博客上。

  参考资料:《计算机算法设计与分析》(第三版)。
  条件:
  (1)带权有向图 G = (V, E); 任意边的权 >= 0;

  算法:
  贪心法。体现在从源节点开始,每次从集合S外“选一个最近的节点”添加到S中,然后对dist数组做更新。

     

  参数说明:

  T:模板参数,权值类型。(计量长度的数据类型)

  int n; 图的节点数;  

  int v; 出发节点(源节点)的索引。

  T dist[];  dist[i]表示当前条件下 v 到 i 节点之间的最短距离。求解过程中这个数组随着集合S的扩充而动态变化。

  int prev[]; prev[i]表示从 v 到 i 节点之间的最短距离路径上的前一个节点。可以通过这个数组反塑获取到完整路径。

  T *c; 图的矩阵表示。c[i][j]表示边(i,j)的权。当无通路时为一个大数。 

 =========================  

      代码:

========================= 

 img_1c53668bcee393edac0d7b3b3daff1ae.gifimg_405b18b4b6584ae338e0f6ecaf736533.gifCode_Dijkstra
// Dijkstra.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>

#define maxint 0x7fffffff

//dijkstra 算法 ,索引是从1开始的

template <class T>
void Dijkstra(int n, int v, T dist[], int prev[], T* c)
{
    
int i, j, temp, u;
    T newdist;
    
//bool s[6];
    bool *= (bool*)malloc(n*sizeof(bool));
    printf("sizeof(bool) = %d bytes. \n"sizeof(bool)); //1 bytes;

    
//[0] 初始化
    for(i = 0; i < n; i++)
    {
        dist[i] = c[v*n+i]; //c[v][i]
        s[i]=false;            //在集合S外
        if(dist[i] == maxint) prev[i] = 0;
        
else prev[i] = v;
    }

    
//把节点v放入集合S中
    dist[v]=0;
    s[v] = true;

    
//向S集合中依次添加其他(n-1)个节点
    for(i = 0; i < (n-1); i++)
    {
        temp = maxint;
        u = v;

        
//[1] 选出S集合外的距离最近的一个点u
        for(j = 0; j < n; j++)
        {
            
if(!s[j] && (dist[j] < temp))
            {
                u = j;
                temp = dist[j];
            }
        }

        
//[2] 把u放入S集合;
        s[u] = true

        
//[3] 调整dist数组和prev数组
        for(j = 0; j < n; j++)
        {
            
//查看 u 到 j 节点之间有通路???
            if!s[j] && c[u*n+j] < maxint ) //if( !s[j] && c[u][j] < maxint )
            {
                newdist = dist[u] + c[u*n+j]; //newdist = dist[u]+ c[u][j];
                if(newdist < dist[j])
                {
                    dist[j] = newdist;
                    prev[j] =u;
                }
            }
        }
    }

    free(s);
}


int main(int argc, char* argv[])
{
    
int i, dist[5], prev[5];
    
int c[5][5= 
    {
        
//     0       1       2       3       4
        {      0,     10, maxint,     30,    100 }, //0
        {     10,      0,     50, maxint, maxint }, //1
        { maxint,     50,      0,     20,     10 }, //2
        {     30, maxint,     20,      0,     60 }, //3
        {    100, maxint,     10,     60,      0 }  //4
    };


    
//调用算法 节点数=5,出发节点=0
    Dijkstra<int>(50, dist, prev, (int*)c);

    
//【1】打印节点1到其他节点的最短距离
    printf("dist: ");
    
for(i=0; i<5; i++)    printf("%d,", dist[i]);
    printf("\n");

    
//【2】打印prev数组,记录从出发点到本节点的最短路径的上一个节点
    printf("prev: ");
    
for(i=0; i<5; i++) printf("%d,", prev[i]);
    printf("\n");

    
//【3】打印从0到4的最短路径
    printf("0->4 Path: ");
    
int stack[5], top=-1;
    stack[++top] = 4;
    
//逆向追溯节点(入栈)
    while(true)
    {
        stack[top+1= prev[stack[top]];
        top++;

        
//栈顶是否已经是出发点
        if(stack[top] == 0)
            
break;
    }
    
//节点依次出栈
    for(;top>0;top--)
        printf("%d - ", stack[top]);
    
//栈中最后一个节点
    printf("%d\n", stack[top]);
    
return 0;
}

=========================
      输出:
=========================
sizeof(bool) = 1 bytes.
dist: 0,10,50,30,60,
prev: 0,0,3,0,2,
0->4 Path: 0 - 3 - 2 - 4 

 

目录
相关文章
|
1月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
1月前
|
自然语言处理 算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
37 0
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
|
2月前
|
算法 Java
Java语言实现最短路径算法(Shortest Path)
Java语言实现最短路径算法(Shortest Path)
42 3
|
1月前
|
算法 定位技术
路径规划算法 - 求解最短路径 - A*(A-Star)算法
路径规划算法 - 求解最短路径 - A*(A-Star)算法
34 0
|
1月前
|
算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
38 0
|
2月前
|
算法 Java C++
《经典图论算法》迪杰斯特拉算法(Dijkstra)
这个是求最短路径的迪杰斯特拉算法,另外我还写了50多种《经典图论算法》,每种都使用C++和Java两种语言实现,熟练掌握之后无论是参加蓝桥杯,信奥赛,还是其他比赛,或者是面试,都能轻松应对。
|
16天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
16天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
17天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
18天前
|
算法
基于SIR模型的疫情发展趋势预测算法matlab仿真
该程序基于SIR模型预测疫情发展趋势,通过MATLAB 2022a版实现病例增长拟合分析,比较疫情防控力度。使用SIR微分方程模型拟合疫情发展过程,优化参数并求解微分方程组以预测易感者(S)、感染者(I)和移除者(R)的数量变化。![]该模型将总人群分为S、I、R三部分,通过解析或数值求解微分方程组预测疫情趋势。