使用并查集重构树与奇度点配对。
首先,每条链路实地巡检一次的费用固定为 S=∑i=1qci。重复实地经过一条非自环链路,可以改为沿该链路调度专线,费用不增加;重复经过自环则可以直接省略。因此只需考虑每条链路实地巡检恰好一次。原图连通,要形成从节点 1 出发并回到节点 1 的欧拉回路,只需用专线将所有奇度点两两配对。
关键在于专线票价。按编号依次加入链路,设 Ci 为加入第 i 条链路后、包含该链路的连通块。对于 Ci 内任意两个不同节点,都能选择一条经过第 i 条链路、且不经过更大编号链路的路径,所以可以支付 ci 进行传送。
据此按编号建立并查集重构树:原节点为叶子;链路连接两个不同连通块时,新建父节点并记录费用 ci;若两端已经连通,则用 ci 更新当前连通块对应树节点的最小费用。由于祖先连通块内的专线也能用于子连通块,按树节点编号从大到小传播最小费用,得到 best[v]。任意两点间的最低专线费用,就是它们在重构树中的最近公共祖先对应的 best 值。
运维员要在一张通信网里完成一次闭环巡检。网中有 p 个节点(编号 1 到 p)和 q 条链路,链路按输入顺序编号为 1 到 q。第 i 条链路连接节点 xi,yi,通行费用为 ci。保证整张网连通;允许自环与重边。
运维员初始位于节点 1,可反复执行以下两类操作:
请计算:从节点 1 出发,使全部链路都被实地巡检覆盖,最后返回节点 1 时的最小总花费。
第一行一个整数 g(1≤g≤104),表示询问组数。
接下来共有 g 组数据,每一组格式如下:
第一行两个整数 p,q(1≤p≤2×105,0≤q≤2×105)。
若 q>0,第二行 q 个整数 x1,x2,…,xq。
第三行 q 个整数 y1,y2,…,yq。
第四行 q 个整数 c1,c2,…,cq。
第 i 条链路连接 xi 与 yi,费用为 ci(1≤xi,yi≤p,1≤ci≤109)。当 q=0 时,上述三行省略。
保证每组图连通;所有组的 p 之和与 q 之和均不超过 5×105。
输出一行,包含 g 个整数,相邻整数之间用单个空格隔开。
第 t 个数表示第 t 组的最小总花费。
输入
4
1 0
1 2
1 1
1 1
5 3
2 1
1
2
7
4 4
1 2 3 1
2 3 4 1
10 10 10 1
输出
0 8 14 32
说明
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册