Roads in Berland

本文介绍了一个关于Berland城市间最短路径的优化问题,通过使用改进的Floyd算法,有效地减少了时间复杂度,避免了超时问题。文章详细解释了如何仅更新涉及到新道路连接的两个城市之间的路径,从而实现对整个城市网络最短路径总和的快速计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:传送门

题意描述:

       有n座城市在Berland,然后给你一个n*n的矩阵,表示第i座城市和第j座城市的最短路径。现在,Berland政府计划修建k条新道路。对于每条规划中的道路,我们知道它的长度以及它将连接的城市。为了控制新道路建设的正确性,在另一条道路开通后,Berland政府希望检查所有城市之间最短距离的总和。

题目分析:

       这道题一看就是求最短路径的问题,而且是用邻接矩阵法来表示路径的长度的,那么,很显然是Floyd算法,但如果用完整的Floyd算法时间复杂度为300^4,明显会超时。所以,要用到小小的优化。因为每次修改的路径只是两个点,那么,其他路径如果变短的话肯定会经过这两个点,所以我们Floyd的时候只遍历这两个点作为中间变量的就行,少了一次循环,时间复杂度为300^3.还要注意的是最后总路径长度会爆int的,要用long long存。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, k, m[304][304];
ll ans[304];
int main(){
    cin >> n;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j) scanf("%d", &m[i][j]);
    cin >> k;
    int u, v, val;
    for(int d=1;d<=k;++d){
        scanf("%d %d %d", &u, &v, &val);
        if(val < m[u][v]){
            m[u][v] = m[v][u] = val;
            for(int i=1;i<=n;++i){
                for(int j=1;j<=n;++j) m[i][j] = m[j][i] = min(m[i][j], m[i][u]+m[u][j]);
            }
            for(int i=1;i<=n;++i){
                for(int j=1;j<=n;++j) m[i][j] = m[j][i] = min(m[i][j], m[i][v]+m[v][j]);
            }
        }
        ll sum = 0;
        for(int i=1;i<=n;++i){
            for(int j=i+1;j<=n;++j){
                sum += m[i][j];
            }
        }
        ans[d] = sum;
    }
    for(int i=1;i<k;++i) printf("%lld ", ans[i]);
    printf("%lld\n", ans[k]);
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值