CF1737D Ela and the Wiring Wizard

有趣题。

首先注意到,一次操作某种意义上相当于,将两条相邻的边中较大的边权改为较小的边权。而显然不能简单地将全图边权直接像这样改为最小的那个,因为我们不一定要走完全图,我们只需要走一条路径。

考虑这样一条路径上的边权最小的边。我们可以将其不断地操作,类似一个一个点地吃掉,使得最后这条边吃到能直接连接 $1\to n$。形式化地,假设路径为 $1 \to p_1\to p_2\to p_3\to\dots\to p_k\to n$,要扩展的边为 $p_x\to p_{x+1}$,则可以通过操作 $(p_{x-1},p_{x},p_{x+1})$ 得到与原边相同边权的 $p_{x-1}\to p_{x+1}$,或者通过操作 $(p_{x},p_{x+1},p_{x+2})$ 得到 $p_{x}\to p_{x+2}$,这时路径上就可以去掉一个点,反复操作使得原路径变为 $1\to n$。这里我们发现答案是 $\min w_i\times(dis_{1,u_i}+dis_{v_i,n}+1)$,其中 $dis$ 表示两点不考虑边权的最短路,即最少边数,floyd 跑一遍就能算。上面那个式子,$u_i,v_i$ 还要反过来计算一次。

写出来上面那个式子,你会愉快地发现你样例都过不去。考虑这样一个东西:

1
6 5
2 3 1
3 4 114514
4 5 114514
5 6 114514
1 5 114514

显然这个时候边权为 $114514$ 的边都无法构成最优解,关键放在我们的边权为 $1$ 的点上。仔细观察题目,可以发现 $u,t$ 可以相同,这意味着我们可以“牵一发而动全身”,找一个中转点,将一个端点先挪过去,然后再走自己这条边把 $v$ 也挪过去。只需要挪一个点再加上 $1$,总代价大概少了一半!这时你还有这条边吗?如有!反正自环也是边,继续操作也行。于是我们枚举一个中转点,然后两个端点再从这个中转点分家分别去 $1,n$。这里操作的次数是 $\min_{k=1}^n \min(dis_{u,k},dis_{v,k})+1+dis_{1,k}+dis_{k,n}$,计算答案同理,加一再乘上边权。

然后这题就做完啦。时间复杂度 $\Theta(n^3+nm)$。

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int maxn = 5e2 + 10;
const int inf = 1e15;

struct edge { int u, v, w; };
int T, n, m;
int dis[maxn][maxn];
edge e[maxn * maxn];

signed main() {
    cin >> T;
    while (T--) {
        cin >> n >> m;
        for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) dis[i][j] = inf * (i != j);
        for (int i = 1, u, v, w; i <= m; i++) cin >> u >> v >> w, e[i] = {u, v, w}, dis[u][v] = dis[v][u] = 1;
        for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
        int ans = inf;
        for (int i = 1; i <= m; i++) {
            int u = e[i].u, v = e[i].v, cur = min(dis[u][1] + dis[v][n], dis[v][1] + dis[u][n]);
            for (int k = 1; k <= n; k++) cur = min(cur, min(dis[u][k], dis[v][k]) + 1 + dis[k][1] + dis[k][n]);
            ans = min(ans, (cur + 1) * e[i].w);
        }
        cout << ans << endl;
    }
    return 0;
}
posted @   TernaKagiri  阅读(8)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示