ARC078F
这是一道容易想假的题(个人认为)。
首先有一个转化,我们发现直接删边不好做,我们考虑如果已经知道这条唯一路径该怎么做。我们画完图后发现,保留的图一定会是路径中的点挂着若干个路径以外的点,并且这些点可以任意互相连边,路径中不同点挂着的点集一定不能互相连边。
但是直接枚举这条路径会超时,这时候我们发现,除了这条路径以外的点的连边情况并不受路径内的连边顺序所影响,比如说 1->2->3->4
和 1->3->2->4
,他们即使顺序不同,但是对答案不会产生影响,因为我们实质上关系的是这条路径上的点集,而不是这条路径。这时就很容易想到 dp 了,处理顺序也是容易的,我们设
其中
一定要注意 dp 的初始化。
代码(我想代码应该不难写):
auto main () -> int
{
n = rd (), m = rd ();
rep (i, 1, m) { int u = rd (), v = rd (), w = rd (); e[u][v] = e[v][u] = w; ret += w; }
int maG = (1 << n) - 1; rep (S, 1, maG)
{ ve.clear (); rep (j, 0, n - 1) if (S >> j & 1) ve.eb (j + 1);
for (auto u : ve) for (auto v : ve) { Gat[S] += e[u][v]; } Gat[S] >>= 1;
} rep (S, 1, maG) rep (i, 1, n) f[S][i] = -1e12;
rep (S, 1, maG) if (S & 1) f[S][1] = Gat[S]; rep (S, 1, maG - 1)
{ if (! (S & 1)) continue; if (S >> (n - 1)) continue; int Ga = maG ^ S;
rep (i, 0, n - 1)
{ if (! (S >> i & 1)) continue;
for (int T = Ga; T; T = (T - 1) & Ga)
rep (j, 0, n - 1) if (T >> j & 1)
if (e[i + 1][j + 1])
f[S | T][j + 1] = max (f[S | T][j + 1], f[S][i + 1] + Gat[T] + e[i + 1][j + 1]);
}
} printf ("%lld\n", ret - f[(1 << n) - 1][n]);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?