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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】