聊一聊利用Dijkstra求有向图的最短路径

简介: 我们都知道求最短路径有很多方法,比如Dijkstra算法、Bellman-Ford算法、Floyd-Warshall算法等等,这些算法各有优缺点,其中Floyd-Warshall算法时间复杂度较高,但是编码复杂度较小,而Bellman-Ford算法适用于处理有负权边的情况。至于本文要讲的Dijkstra算法,优点就是时间复杂度较小,但是不能处理有负权边的图。我们需要根据不同情况选择不同的算法。

聊一聊利用Dijkstra求有向图的最短路径

0x00 前言

我们都知道求最短路径有很多方法,比如Dijkstra算法、Bellman-Ford算法、Floyd-Warshall算法等等,这些算法各有优缺点,其中Floyd-Warshall算法时间复杂度较高,但是编码复杂度较小,而Bellman-Ford算法适用于处理有负权边的情况。至于本文要讲的Dijkstra算法,优点就是时间复杂度较小,但是不能处理有负权边的图。

我们需要根据不同情况选择不同的算法。

0x01 代码分析

#include<stdio.h>
#define MAXVEX 10
int graph[MAXVEX][MAXVEX];
int short_path[MAXVEX];
int prev_v[MAXVEX];

先导入标准输入输出库,我们将节点数设置为10个,然后设置存储图的graph、存储源点到其他各点的最短路径长度的short_path,还有存储最短路径上各节点的前置节点的prev_v。

1. 建图

void create_graph( void ){
    for(int i=0;i<10;i++){
        for(int j=0;j<10;j++){
            if(i==j){
                graph[i][j]=0;
                continue;
            }
            graph[i][j] = 99999;
        }
    }
    printf("请输入有向边的条数:");
    int n;
    scanf("%d",&n);
    for(int k=0;k<n;k++){
        int i,j,value;
        scanf("%d %d %d",&i,&j,&value);
        graph[i][j]=value;
    }
}

然后就是将图初始化了。这里我们将没个顶点到自己的距离初始化为0,然后将其他点先全部初始化为99999,然后在给每条边赋权值。

2. 求最短路径

void Dijkstra(int g[10][10], int v0) {
    int final[MAXVEX];
    int j = 0;
    int k = 0;
    for(j = 0; j<MAXVEX; j++) { 
        final[j] = 0;
        short_path[j] = g[v0][j];
        prev_v[j] = 0;
    }
    final[v0] = 1; 
    short_path[v0] = 0;
    
    for(int i = 1; i < MAXVEX; i++) { 
        int min = MAXVEX;
        k = 0;
        for(int j=0; j<MAXVEX; j++) {
            if(final[j]==0 && short_path[j]<min) {
                min = short_path[j];
                k = j;
            }
        }
        final[k] = 1; 
        
        for(int j=0; j<MAXVEX; j++) {
            if(final[j]==0 && min+g[k][j] < short_path[j]) {
                short_path[j] = min+g[k][j];
                prev_v[j] = k;
            }
        }
    }
}

大餐来了,迪杰斯特拉算法来了!

该函数传入的参数是图和源点。

我们使用一个数组来标记是否源点到该点已经找出了最短路径。

再将final、short_path、prev_v初始化,将v0的所有边加入short_path。

因为源点到源点的最短距离已经确定了是0,所以我们将final[v0]标记为1,short_path[v0]标记为0。

然后接下来的第一个循环表示一共需要找MAXVEX-1条最短路径,然后从源点到剩余未被标记的顶点中寻找最短的一条路径。然后将找到的下一个点标记,表示源点到该点的路径已经找到。
然后看一看源点到其它各顶点(尚未确定最短路径的顶点)的最短路径中,如果途经顶点k的路径长度比原路径更短,就更新。并设置k为j的前置节点。

3. 输出最短路径

void show_shortest_path( int source ,int end) {
    int que[10];
    int tot = 1;
    printf("source到%d的最短路径: ",end);
    que[tot] = end;
    tot++;

    int i = prev_v[end];
    while(i != source) {
        que[tot] = i;
        tot++;
        i = prev_v[i];
    }
    que[tot] = source;
    for(int i=tot;i>=1;i--){
        if(i!=1){
            printf("%d->",que[i]);
        }else{
            printf("%d",que[i]);
        }
        
    }
    printf("\n");
}

就是建一个数组当作队列,然后将每次找到的节点放到队列中,然后顺序遍历。

目录
相关文章
|
数据采集 数据挖掘 API
主流电商平台数据采集API接口|【Python爬虫+数据分析】采集电商平台数据信息采集
随着电商平台的兴起,越来越多的人开始在网上购物。而对于电商平台来说,商品信息、价格、评论等数据是非常重要的。因此,抓取电商平台的商品信息、价格、评论等数据成为了一项非常有价值的工作。本文将介绍如何使用Python编写爬虫程序,抓取电商平台的商品信息、价格、评论等数据。 当然,如果是电商企业,跨境电商企业,ERP系统搭建,我们经常需要采集的平台多,数据量大,要求数据稳定供应,有并发需求,那就需要通过接入电商API数据采集接口,封装好的数据采集接口更方便稳定高效数据采集。
|
存储 缓存 安全
每日一博 - ThreadLocal VS InheritableThreadLocal VS TransmittableThreadLocal
每日一博 - ThreadLocal VS InheritableThreadLocal VS TransmittableThreadLocal
203 0
|
缓存 JavaScript API
「Vue3系列」Vue3 计算属性(computed)、监听属性(watch)
在 Vue 3 中,计算属性(Computed Properties)是一种强大的功能,它允许你声明一个依赖于其他响应式数据属性的属性,并且这个属性的值会根据其依赖的数据的变化而自动更新。计算属性是基于它们的依赖关系进行缓存的,只有在它的相关依赖发生改变时才会重新求值。
1736 0
|
Java Maven
Maven 引入外部依赖
在 Maven 项目中引入外部库如 ldapjdk.jar,通常涉及将 jar 存放在 `src/lib` 并在 `pom.xml` 添加系统依赖。
|
机器学习/深度学习 传感器 算法
【圆检测】基于霍夫变换检测灰度图像中不同半径的圆附matlab代码
【圆检测】基于霍夫变换检测灰度图像中不同半径的圆附matlab代码
|
Java 关系型数据库 MySQL
SpringBoot 系列教程 JPA 错误姿势之环境配置问题
又回到 jpa 的教程上了,这一篇源于某个简单的项目需要读写 db,本想着直接使用 jpa 会比较简单,然而悲催的是实际开发过程中,发现了不少的坑;本文为错误姿势第一篇,Repository 接口无法注入问题
718 0
|
2天前
|
人工智能 运维 安全
|
5天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
386 124
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
|
7天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
704 107