[USACO22DEC] Breakdown P 题解
T1 [USACO22DEC] Breakdown P
比较显然的一点是,一次加一条边/一次删一条边,显然转化,这是显然的一条套路。
这题的
,在 的情况下,更新 ; ,对 ,更新 ; ,同理,用 更新 ,其中 是两点间边权; ,同理,用 更新 ,其中 是你处理好的 。
细节懒得说了,总之单次加边复杂度均摊
void cm(int &x, int y) {
x = x < y ? x : y;
}
constexpr int MAXN = 305;
int n, k, w[MAXN][MAXN], ans[MAXN * MAXN];
struct {
int u, v;
} del[MAXN * MAXN];
struct {
int st, k;
int w[MAXN][MAXN], f[MAXN][MAXN], h[MAXN];
void init(int _k, int _st) {
k = _k, st = _st;
memset(w, 0x3f, sizeof(w));
memset(f, 0x3f, sizeof(f));
memset(h, 0x3f, sizeof(h));
if (!k)h[st] = 0;
}
void add(int u, int v, int ww) {
w[u][v] = ww;
if (!k)return;
if (k == 1)return u == st && (h[v] = ww), void();
for (int i = 1; i <= n; ++i) {
cm(f[i][v], w[i][u] + ww);
cm(f[u][i], ww + w[v][i]);
}
if (k == 2)for (int i = 1; i <= n; ++i)cm(h[i], f[st][i]);
else {
auto p = k == 3 ? w : f;
if (u == st)
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
cm(h[j], f[st][i] + p[i][j]);
else
for (int i = 1; i <= n; ++i) {
cm(h[i], f[st][v] + p[v][i]);
cm(h[i], f[st][u] + p[u][i]);
cm(h[u], f[st][i] + p[i][u]);
cm(h[v], f[st][i] + p[i][v]);
}
}
}
} s, t;
signed main() {
// freopen("data.in","r",stdin);
n = read(), k = read();
for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)w[i][j] = read();
for (int i = 1; i <= n * n; ++i)del[i] = {read(), read()};
s.init(floor(k * 0.5), 1), t.init(ceil(k * 0.5), n);
for (int i = n * n; i; --i) {
ans[i] = 1e9;
for (int j = 1; j <= n; ++j)cm(ans[i], s.h[j] + t.h[j]);
s.add(del[i].u, del[i].v, w[del[i].u][del[i].v]);
t.add(del[i].v, del[i].u, w[del[i].u][del[i].v]);
}
for (int i = 1; i <= n * n; ++i)write(ans[i] == 1e9 ? -1 : ans[i]);
return fw, 0;
}
即得易见平凡,仿照上例显然。留作习题答案略,读者自证不难。
反之亦然同理,推论自然成立。略去过程 ,由上可知证毕。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现