[临时]单源最短路径(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 

 

目录
相关文章
|
4月前
|
存储 运维 监控
基于 C# 语言的 Dijkstra 算法在局域网内监控软件件中的优化与实现研究
本文针对局域网监控系统中传统Dijkstra算法的性能瓶颈,提出了一种基于优先队列和邻接表优化的改进方案。通过重构数据结构与计算流程,将时间复杂度从O(V²)降至O((V+E)logV),显著提升大规模网络环境下的计算效率与资源利用率。实验表明,优化后算法在包含1000节点、5000链路的网络中,计算时间缩短37.2%,内存占用减少21.5%。该算法适用于网络拓扑发现、异常流量检测、故障定位及负载均衡优化等场景,为智能化局域网监控提供了有效支持。
100 5
|
1月前
|
机器学习/深度学习 编解码 算法
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
165 4
|
2月前
|
算法 机器人 定位技术
基于机器视觉和Dijkstra算法的平面建筑群地图路线规划matlab仿真
本程序基于机器视觉与Dijkstra算法,实现平面建筑群地图的路径规划。通过MATLAB 2022A读取地图图像,识别障碍物并进行路径搜索,支持鼠标选择起点与终点,最终显示最优路径及长度,适用于智能导航与机器人路径规划场景。
|
8月前
|
存储 算法 测试技术
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
|
8月前
|
算法 编译器 C++
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
|
18天前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
129 3
|
22天前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
|
12天前
|
机器学习/深度学习 算法 数据可视化
基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
本程序基于MATLAB实现MVO优化的DBSCAN聚类算法,通过多元宇宙优化自动搜索最优参数Eps与MinPts,提升聚类精度。对比传统DBSCAN,MVO-DBSCAN有效克服参数依赖问题,适应复杂数据分布,增强鲁棒性,适用于非均匀密度数据集的高效聚类分析。
|
12天前
|
开发框架 算法 .NET
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
简介:本文介绍基于ADMM的MIMO信号检测算法,结合无穷范数优化与交替方向乘子法,降低计算复杂度并提升检测性能。涵盖MATLAB 2024b实现效果图、核心代码及详细注释,并对比ML、MMSE、ZF、OCD_MMSE与LAMA等算法。重点分析LAMA基于消息传递的低复杂度优势,适用于大规模MIMO系统,为通信系统检测提供理论支持与实践方案。(238字)
|
22天前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
139 14

热门文章

最新文章

下一篇
oss教程