感觉现在的我还比较难想到这个思路啊。
距离累加和,是由边决定的,所以我们计算每条边的贡献。
可以知道,对于一条边e,如果起点端有 x 个友好城市,终点端有 y 个友好城市,那么这条边的最大贡献就是 min( x,y ),因为少的那端怎么样也只有x个,再没法提供城市给另一端匹配了。
至于如何求一端的友好城市数,实际上就是求子集(当然子节点应该是友好城市才能计数)大小,因为这端是 x ,那另一端肯定是 ( ( k<<1 )-x )。问题就转化为一个很基本的树形dp套路了,用我参考的那篇题解的话说,就是绝世傻题。
const int maxn=200010;
int n,k;
bool node_[maxn];
struct edge
{
int y,next;
bool f;
}e[maxn<<1];
int link_[maxn];
int tot_;
i