【Day53 LeetCode】图论问题

一、图论问题

1、Floyd算法

之前提到的dijkstra算法和Bellman算法都是只能有一个起点,而这题是求多个起点到多个终点的多条最短路径。Floyd算法的思想是动态规划。

dp数组,grid[i][j][k] = m,表示 节点i 到 节点j 以[1...k] 集合中的一个节点为中间节点的最短距离为m。

dp方程,节点i 到 节点j 的最短路径是否经过节点k。若经过,grid[i][j][k] = grid[i][k][k - 1] + grid[k][j][k - 1];若不经过,grid[i][j][k] = grid[i][j][k - 1]。所以,递推方程为grid[i][j][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1])

CPP 复制代码
#include <iostream>
#include <vector>
#include <list>
using namespace std;

int main() {
    int n, m, p1, p2, val;
    cin >> n >> m;

    vector<vector<vector<int>>> grid(n + 1, vector<vector<int>>(n + 1, vector<int>(n + 1, 10005)));  // 因为边的最大距离是10^4
    for(int i = 0; i < m; i++){
        cin >> p1 >> p2 >> val;
        grid[p1][p2][0] = val;
        grid[p2][p1][0] = val; 
    }
    // 开始 floyd
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                grid[i][j][k] = min(grid[i][j][k-1], grid[i][k][k-1] + grid[k][j][k-1]);
            }
        }
    }
    // 输出结果
    int z, start, end;
    cin >> z;
    while (z--) {
        cin >> start >> end;
        if (grid[start][end][n] == 10005)
            cout << -1 << endl;
        else
            cout << grid[start][end][n] << endl;
    }
}

空间优化,减少dp数组的一个维度,代码如下:

CPP 复制代码
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, m, p1, p2, val;
    cin >> n >> m;

    vector<vector<int>> grid(n + 1, vector<int>(n + 1, 10005));  // 因为边的最大距离是10^4

    for(int i = 0; i < m; i++){
        cin >> p1 >> p2 >> val;
        grid[p1][p2] = val;
        grid[p2][p1] = val; 

    }
    // 开始 floyd
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                grid[i][j] = min(grid[i][j], grid[i][k] + grid[k][j]);
            }
        }
    }
    // 输出结果
    int z, start, end;
    cin >> z;
    while (z--) {
        cin >> start >> end;
        if (grid[start][end] == 10005)
        	cout << -1 << endl;
        else
        	cout << grid[start][end] << endl;
    }
}

2、A star算法

BFS 是没有目的性的 一圈一圈去搜索, 而 A * 是有方向性的去搜索,这个是A算法和BFS最本质的区别。A的方向由启发性函数决定,这部分代码之后补上。

相关推荐
千金裘换酒26 分钟前
LeetCode 删除链表的倒数第N个结点
算法·leetcode
SweetCode39 分钟前
【无标题】
开发语言·c++·算法
shughui44 分钟前
Python基础面试题:语言定位+数据类型+核心操作+算法实战(含代码实例)
开发语言·python·算法
王老师青少年编程1 小时前
信奥赛C++提高组csp-s之拓扑排序详解
c++·算法·拓扑排序·csp·信奥赛·csp-s·提高组
kaikaile19951 小时前
matlab计算流场
人工智能·算法·matlab
老鼠只爱大米1 小时前
LeetCode算法题详解 42:接雨水
leetcode·动态规划·双指针·单调栈·接雨水·雨水收集
3GPP仿真实验室1 小时前
【Python源码】6G:PyTorch OFDM 教学仿真平台
算法
xie_pin_an1 小时前
C++ 从入门到进阶:核心知识与实战指南
java·c++·算法
我是个菜鸡.2 小时前
多模态算法面经准备
算法
AlenTech2 小时前
739. 每日温度 - 力扣(LeetCode)
算法·leetcode·职场和发展