标签:ma Complete int siz AGC034E Compress dfs sum dis
https://www.luogu.com.cn/problem/AT4995
枚举最后移动到的那个点,然后考虑DP
设
f
[
u
]
f[u]
f[u]表示以
u
u
u结点为子树尽量多匹配点的移动的距离和(把多少对移动到)
草讲不清楚,看代码吧
code:
#include<bits/stdc++.h>
#define N 2005
using namespace std;
int dis[N], siz[N], a[N], n, f[N], ans;
vector<int> g[N];
void dfs(int u, int fa) {
dis[u] = 0, siz[u] = a[u];
int p = 0;
for(int v : g[u]) {
if(v == fa) continue;
dfs(v, u); siz[u] += siz[v], dis[u] += dis[v];
if(dis[v] > dis[p]) p = v;
}
int sum = dis[u], ma = dis[p];
if(!p) f[u] = 0;
else if(sum - ma >= ma) f[u] = dis[u] / 2;
else f[u] = sum - ma + min((sum - 2 * (sum - ma)) / 2, f[p]);
if(fa) dis[u] += siz[u];
}
void solve(int u) {
dfs(u, 0);
// printf(" %d %d %d\n", u, dis[u], f[u]);
// for(int i = 1; i <= n; i ++) printf("%d ", dis[i]); printf("\n");
// for(int i = 1; i <= n; i ++) printf("%d ", siz[i]); printf("\n");
// for(int i = 1; i <= n; i ++) printf("%d ", f[i]); printf("\n");
if(dis[u] % 2 == 0 && f[u] * 2 == dis[u]) ans = min(ans, f[u]);
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++) scanf("%1d", &a[i]);
for(int i = 1; i < n; i ++) {
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v), g[v].push_back(u);
}
ans = 1e9;
for(int i = 1; i <= n; i ++) solve(i);
if(ans == (int)1e9) ans = -1;
printf("%d", ans);
return 0;
}
标签:ma,Complete,int,siz,AGC034E,Compress,dfs,sum,dis 来源: https://blog.csdn.net/qq_38944163/article/details/121842617
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。