当前位置: 首页 > ops >正文

多源最短路径(Floyed)

#include <iostream>

#include <vector>

#include <stack>

using namespace std;

class Graph{

    private:

        int vertex;      //顶点数

        //int** matrix;    //有向图关系矩阵

        int** path;    //存储关系矩阵

        int** pre;         //存储中间节点k

    public:

        const int maxium = 10000;                //最大值,表示不存在的边

        Graph(const int edges, const int nodes, int arr[][3]){

            vertex = nodes;  

            //matrix = new int* [vertex];          //生成有向图关系矩阵

            pre = new int* [vertex];

            path = new int* [vertex];             //生成有向图关系矩阵

            for (int i=0; i<vertex; ++i){

                pre[i] = new int[vertex];

                path[i] = new int[vertex];

                //matrix[i] = new int[vertex];

                for (int j=0; j<vertex; j++){

                    //matrix[i][j] = maxium;

                    path[i][j] = maxium;

                    pre[i][j] = -1;

                }

            }

            for (int i=0; i<edges; ++i){                    //生成有向图关系,maxium为不连接

                //matrix[arr[i][0]][arr[i][1]] = arr[i][2];

                path[arr[i][0]][arr[i][1]] = arr[i][2];

            }

        }

        ~Graph(){

            delete[] path;

            //delete[] matrix;

            delete[] pre;

        }

        void floyd(int s, int end){

            for (int k=0; k<vertex; ++k){ //中间点更新

                for (int i=0; i<vertex; ++i){ //起点

                    for (int j=0; j<vertex; ++j){ //终点

                        if (path[i][k] + path[k][j] < path[i][j]){

                            path[i][j] = path[i][k] + path[k][j];

                            pre[i][j] = k;

                        }

                    }

                }

            }    

            show(s, end);

        }

        void show(int start, int end){  //显示路径,单源,多源直接for循环调用这个函数

            int k = pre[start][end];

            if (k != -1){

                show(start, k);

                cout << k << " ";

                show(k, end);

            }

        }

};

int main(){

    int arr[][3] = {{0,1,8},{0,3,16,},{0,4,7},{1,3,9},{1,5,5},{2,9,2},

                   {3,2,1},{3,6,10},{3,8,12},{4,7,5},{4,3,9},{4,8,7},{5,3,2},

                   {5,2,11},{6,2,13},{6,9,2},{7,6,8},{8,7,1},{8,6,6}};//创建一个有向权值图,每一列分别对应起点,终点,权值

    Graph t(19, 10, arr);

    t.floyd(0, 9);

    return 0;

}

http://www.xdnf.cn/news/5352.html

相关文章:

  • 【人工智能】微调魔法:释放大模型的个性化潜能
  • 微机系统:第二章节:16位的intel8086处理器
  • 嵌入式硬件篇---无线通信模块
  • 【PostgreSQL系列】PostgreSQL性能优化
  • springboot3+vue3融合项目实战-大事件文章管理系统-参数校验优化
  • 十、STM32入门之低功耗蓝牙(基于ESP32C3芯片)
  • 【数据结构入门训练DAY-31】组合的输出
  • Nacos 起源
  • Docker 部署 - Crawl4AI 文档 (v0.5.x)
  • AI陪练 VS 真人教学
  • 19、DeepSeek LLM论文笔记
  • docker compose ps 命令
  • 三、Hive DDL数据库操作
  • 大模型中的temperature参数是什么
  • 实战项目2(03)
  • C++ 模板方法模式详解
  • [Java][Leetcode simple]26. 删除有序数组中的重复项
  • 关于物联网的基础知识(一)
  • C++ 核心基础:数字、数组、字符串、指针与引用详解
  • 物理机械:什么是泡利不相容原理?
  • 第6讲、全面拆解Encoder、Decoder内部模块
  • 【愚公系列】《Manus极简入门》031-商业模式创新师:“模式筛选者”
  • 栈Stack(附源码)
  • overleaf较高级的细节指令
  • ARM GIC(七)亲和路由:GICD_IROUTER寄存器具体如何与MPIDR配合使用?
  • WEBSTORM前端 —— 第2章:CSS —— 第8节:网页制作2(小兔鲜儿)
  • 【前端】【HTML】【总复习】一万六千字详解HTML 知识体系
  • 3. 仓颉 CEF 库封装
  • Playwright 简介
  • Go语言实现豆瓣电影Top250爬虫