[Luogu P5680][GZOI2017]共享单车
题目链接 之前没看懂题意就把这题扔了,现在一看是读错题意了 简化版题意 给出一颗树(这个图的最短路径生成树),每个点初始颜色为 \(0\) 两种操作: 将部分点颜色取反 给出一些点,建出虚树(边权为两点树上距离),求最小割边代价使得虚树上没有颜色为 \(1\) 的点与根联通 那这就很模板了: 设 \(f[x]\) 表示 \(x\) 子树的答案, \(c[x]\) 表示 \(x\) 的颜色,则有转移方程:(当 \(f[K]=0\) 时输出 \(-1\) ) \[ f[x]+=Val(x,y)\quad (c[y]=1)\\ f[x]+=\min (Val(x,y),f[y])\quad (c[y]=0) \] (注意以上方法没有考虑边权全为 \(0\) 但是答案不为 \(-1\) 的情况,不过好像没有这种数据,反正也不难特判就没管了) 时间复杂度 \(O((N+M)\log N+Qnum(\log num+\log N))\) (数据为什么这么小) 代码: #include <queue> #include <cstdio> #include <cctype> #include <vector> #include <cstring> #include <algorithm> inline char Getchar() { static char In[1<<22],*p1=In,