吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 777|回复: 1
收起左侧

[学习记录] 多元汇最短路算法:Floyd 学习笔记

[复制链接]
RainPPR 发表于 2022-12-24 19:11

Floyd

求多元汇最短路
基于动态规划
复杂度:O(n^3)

思路

  1. 用邻接矩阵存储
    d[i,j] 存储所有的边
  2. 三重循环:
    for k : 1 ~ n
    for i : 1 ~ n
    for j : 1 ~ n
    d[i,j] = min(d[i, j], d[i, k] + d[k, j]);

原理

d[k, i, j] = d[k - 1, i, k] + d[k - 1, k, j]
动态规划降维就OK

代码

代码比较简单,没写注释

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 210, INF = 1e9;

int n, m, Q;
int d[N][N];        // 邻接矩阵

void floyd()
{
        for (int k = 1 ; k <= n ; ++k)
                for (int i = 1 ; i <= n ; ++i)
                        for (int j = 1 ; j <= n ; ++j)
                                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}

int main()
{
        scanf("%d %d %d", &n, &m, &Q);

        for (int i = 1 ; i <= n ; ++i)
                for (int j = 1 ; j <= n ; ++j)
                        if (i == j)
                                d[i][j] = 0;
        else
                d[i][j] = INF;

        int a, b, w;
        while (m--)
        {
                scanf("%d %d %d", &a, &b, &w);
                d[a][b] = min(d[a][b], w);
        }

        floyd();

        while (Q--)
        {
                scanf("%d %d", &a, &b);
                int t = d[a][b];
                if (t > INF / 2)
                        printf("impossible\n");
                else
                        printf("%d\n", d[a][b]);
        }
        return 0;
}

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
King1993 + 1 + 1 我很赞同!
Lucifer_BW + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

King1993 发表于 2022-12-25 00:30
谢谢分享,学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表