传送门
分析
直接求点与点之间的距离感觉不是很好求,所以我们考虑换一个求法。
距离跟路径上边的长度有关,所以我们直接来看每一条边的贡献
对于每一条边,它的贡献等于 (一边的白点数另一边的白点数+一边的黑点数另一边的黑点数)*边权
对于任意一棵子树,只要知道子树的大小和黑点个数,就可以算出将子树与外界相连的那条边的贡献
所以直接dp[i][j]表示i为根节点的子树中与j个黑色节点的对答案的最大贡献,然后直接树上背包就好了。
注意枚举状态的时候不要枚举到无意义的状态
代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=2005;
long long dp[maxn][maxn];
int n,K,ecnt,info[maxn],siz[maxn],inp[maxn],nx[maxn*2],v[maxn*2],w[maxn*2];
void add(int u1,int v1