8.3.1 蓝桥杯图论之Floyd&Dijkstra

这篇具有很好参考价值的文章主要介绍了8.3.1 蓝桥杯图论之Floyd&Dijkstra。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

8.3.1 蓝桥杯图论之Floyd&Dijkstra,蓝桥杯,蓝桥杯,图论,数据结构,算法

8.1.3 蓝桥杯图论之Floyd与Dijkstra算法

在蓝桥杯等算法竞赛中,图论问题占据了重要地位,其中路径查找是一个经常出现的主题。Floyd-Warshall算法和Dijkstra算法是解决图中最短路径问题的两种经典算法。本篇博客将介绍这两种算法的原理和实现,以及它们的应用场景。

Floyd-Warshall算法

Floyd-Warshall算法是一种计算图中所有最短路径的动态规划算法。它能够处理包括负权边的图,但不能处理有负权环的图。算法的核心思想是逐步检查所有顶点对,考虑是否通过一个中间顶点来缩短当前的最短路径。

算法原理

  1. 初始化距离矩阵,对于每一对顶点,如果它们之间有边直接相连,则距离为边的权重,否则距离为无穷大。
  2. 通过三重循环,逐步尝试将每一个顶点作为中间点,更新其他所有顶点对之间的最短距离。

C++实现

#include <iostream>
#include <vector>
using namespace std;

#define INF 99999
#define V 4

void printSolution(int dist[][V]);
void floydWarshall(int graph[][V]) {
    int dist[V][V], i, j, k;

    for (i = 0; i < V; i++)
        for (j = 0; j < V; j++)
            dist[i][j] = graph[i][j];

    for (k = 0; k < V; k++) {
        for (i = 0; i < V; i++) {
            for (j = 0; j < V; j++) {
                if (dist[i][k] + dist[k][j] < dist[i][j])
                    dist[i][j] = dist[i][k] + dist[k][j];
            }
        }
    }

    printSolution(dist);
}

void printSolution(int dist[][V]) {
    cout << "The following matrix shows the shortest distances between every pair of vertices \n";
    for (int i = 0; i < V; i++) {
        for (int j = 0; j < V; j++) {
            if (dist[i][j] == INF)
                cout << "INF" << "     ";
            else
                cout << dist[i][j] << "     ";
        }
        cout << endl;
    }
}

int main() {
    int graph[V][V] = { {0, 5, INF, 10},
                        {INF, 0, 3, INF},
                        {INF, INF, 0, 1},
                        {INF, INF, INF, 0} };
    floydWarshall(graph);
    return 0;
}

Dijkstra算法

Dijkstra算法是一种用于在加权图中找到单源最短路径的贪心算法。它适用于含有非负权重边的图。算法的核心思想是持续更新起点到图中各顶点的最短路径长度。

算法原理

  1. 初始化距离数组,起点到自身的距离为0,到其他所有点的距离为无穷大。
  2. 使用一个集合来跟踪已经访问过的顶点。
    #include <iostream>
    #include <vector>
    #include <climits>
    #include <set>
    using namespace std;
    
    #define V 9
    
    int minDistance(int dist[], bool sptSet[]) {
        int min = INT_MAX, min_index;
    
        for (int v = 0; v < V; v++)
            if (sptSet[v] == false && dist[v] <= min)
                min = dist[v], min_index = v;
    
        return min_index;
    }
    
    void printSolution(int dist[]) {
        cout << "Vertex \t Distance from Source\n";
        for (int i = 0; i < V; i++)
            cout << i << " \t\t" << dist[i] << endl;
    }
    
    void dijkstra(int graph[V][V], int src) {
        int dist[V];
        bool sptSet[V];
    
        for (int i = 0; i < V; i++)
            dist[i] = INT_MAX, sptSet[i] = false;
    
        dist[src] = 0;
    
        for (int count = 0; count < V - 1; count++) {
            int u = minDistance(dist, sptSet);
            sptSet[u] = true;
    
            for (int v = 0; v < V; v++)
                if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v])
                    dist[v] = dist[u] + graph[u][v];
        }
    
        printSolution(dist);
    }
    
    int main() {
        int graph[V][V] = { {0, 4, 0, 0, 0, 0, 0, 8, 0},
                            {4, 0, 8, 0, 0, 0, 0, 11, 0},
                            {0, 8, 0, 7, 0, 4, 0, 0, 2},
                            {0, 0, 7, 0, 9, 14, 0, 0, 0},
                            {0, 0, 0, 9, 0, 10, 0, 0, 0},
                            {0, 0, 4, 0, 10, 0, 2, 0, 0},
                            {0, 0, 0, 14, 0, 2, 0, 1, 6},
                            {8, 11, 0, 0, 0, 0, 1, 0, 7},
                            {0, 0, 2, 0, 0, 0, 6, 7, 0} };
    
        dijkstra(graph, 0);
    
        return 0;
    }
    
  3. 对于每次迭代,从未访问的顶点中选出距离最小的一个,更新它的邻接顶点的距离。

C++实现

 

结语

Floyd-Warshall算法和Dijkstra算法是解决图中最短路径问题的两种重要算法。Floyd-Warshall适用于计算图中所有顶点对之间的最短路径,而Dijkstra算法适用于计算单源最短路径。它们各有优势和局限性,在不同的应用场景下选择合适的算法是解决问题的关键。希望本篇博客能帮助你理解这两种算法的原理和实现,为蓝桥杯等算法竞赛做好准备。

8.3.1 蓝桥杯图论之Floyd&Dijkstra,蓝桥杯,蓝桥杯,图论,数据结构,算法文章来源地址https://www.toymoban.com/news/detail-825796.html

到了这里,关于8.3.1 蓝桥杯图论之Floyd&Dijkstra的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法基础:搜索与图论】3.4 求最短路算法(Dijkstra&bellman-ford&spfa&Floyd)

    关于最短路可见:https://oi-wiki.org/graph/shortest-path/ 无向图 是一种 特殊的 有向图。(所以上面的知识地图上没有区分边有向还是无向) 关于存储:稠密图用邻接矩阵,稀疏图用邻接表。 朴素Dijkstra 和 堆优化Dijkstra算法的 选择就在于图 是 稠密的还是稀疏的。 算法步骤: 有一

    2024年02月16日
    浏览(33)
  • 大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)

      最短路径,对于图来说,是两顶点之间经过的边数最少的路径;对于网来说,是指两顶点之间经过的边上权值之和最小的路径。路径上第一个顶点为源点,最后一个顶点是终点。   以如下无向图为例:   我们来计算下标为0的顶点,到其他顶点的最短路径,首先定义

    2024年02月06日
    浏览(32)
  • 数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。

    最短路径的算法有两个, Dijkstra算法 和 Floyd算法 。 Dijkstra算法 解决的是 单源 最短路径问题 。 Floyd算法解决的是 多源 最短路径问题,并且可以处理负权图 。 今天要讲的就是Dijkstra算法。 加: feng--Insist (大写的i),进java交流群讨论互联网+技术。可索要PPT等资料。 其他资料

    2024年02月11日
    浏览(33)
  • 数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

    目录 问题分类  无权图单源最短路径算法 思路 伪代码 时间复杂度 代码实现(C语言) 有权图单源最短路径算法 Dijkstra(迪杰斯特拉)算法 伪代码  时间复杂度  代码实现(C语言) 多源最短路径算法 两种方法 Floyd算法 代码实现(C语言) 最短路径问题的抽象 在网络中,求

    2024年02月08日
    浏览(49)
  • 图论之寻找桥边

    目录 ①基准法 ②并查集 ③逆向思维之标记环边 ④并查集压缩路径 主函数读取文件调函数方法处理 在图论中,一条边被称为“桥”代表这条边一旦被删除,这张图的连通块数量会增加。等价地说,一条边是一座桥当且仅当这条边不在任何环上。一张图可以有零或多座桥。

    2024年02月16日
    浏览(27)
  • 图论之邻接表

    路径规划算法综述 图论基础介绍 图论之邻接矩阵 目录  路径规划系列文章目录 一、邻接表 二、邻接表实现 2.1 链式前向星实现 2.2 链表实现 三、总结         由于对于稀疏图来说,使用邻接矩阵进行存储显然会使得空间利用率较低,因此利用邻接表来存储图,可以克服

    2024年02月04日
    浏览(31)
  • 图论之邻接矩阵

    路径规划算法综述 图论基础介绍 目录 路径规划系列文章目录 一、图的存储方式介绍 二、邻接矩阵介绍 三、邻接矩阵实现 四、总结          图的结构比较复杂,是非线性结构,任意两点都可能存在联系,相对来说存储方法较多。目前主要有: 邻接矩阵表示法 邻接表表

    2024年02月06日
    浏览(25)
  • 图论之毕克定理证明

    毕克定理是小学四年级奥赛内容,无意间从一本教材上看到,觉得定理蛮有意思,也和自己从事的工作有一些关联,就在网上找了一些证明资料,结合自己的思考,稍微挖掘了以下,聊以记录。 毕克定理是指一个计算点阵中顶点在格点上的多边形面积公式,该公式可以表示为

    2024年02月15日
    浏览(35)
  • C++图论之强连通图

    什么是连通性? 连通,字面而言,类似于自来水管道中的水流,如果水能从某一个地点畅通流到另一个地点,说明两点之间是连通的。也说明水管具有连通性,图中即如此。 无向图和有向图的连通概念稍有差异。 无向图连通性 如果任意两点间存在路径,称此图具有连通性

    2024年02月03日
    浏览(25)
  • 图论之dfs与bfs的练习

    dfs--深度优选搜索 bfs--广度优先搜索 迷宫问题--dfs 问题: 给定一个n*m的二维迷宫数组其中S是起点,T是终点,*是墙壁(无法通过), .是道路 问从起点S出发沿着上下左右四个方向走,能否走到T点?能输出\\\"YES\\\",否则输出\\\"NO\\\"。 8 8 *****... *.S...** *****.** *****..* *T..**.* .**.**.* ..*...

    2024年02月20日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包