比赛 |
2025.1.4 |
评测结果 |
WWWWWWWWWW |
题目名称 |
喵星人集会 |
最终得分 |
0 |
用户昵称 |
健康铀 |
运行时间 |
0.032 s |
代码语言 |
C++ |
内存使用 |
3.41 MiB |
提交时间 |
2025-01-04 16:11:16 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 2007;
const int INF = 1e9;
int n, m, d[N], s[N], f[N], ans = INF;
char a[N];
vector<int> e[N];
void dfs(int x, int p = 0) {
if(a[x] == '1') {
s[x] = 1;
}
else{
s[x] = 0;
}
d[x] = 0;
int maxn= 0;
for (int y : e[x]) {
if (y != p) {
dfs(y, x);
s[x] += s[y];
d[x] += d[y] + s[y];
if (d[y] > d[maxn]) {
maxn = y;
}
}
}
if (d[x] >= 2 * d[maxn]) {
f[x] = d[x] / 2;
} else {
f[x] = d[x] - d[maxn];
int temp = min(f[maxn], (d[maxn] * 2 - d[x]) / 2);
f[x] += temp;
}
}
int main() {
freopen("party.in","r",stdin);
freopen("party.out","w",stdout);
cin >> n;
cin >> (a + 1);
for (int i = 1; i <= n; i++) {
if (a[i] == '1') {
m++;
}
}
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
for (int i = 1; i <= n; i++) {
dfs(i);
if (d[i] % 2 == 0) {
if (f[i] * 2 >= d[i]) {
ans=min(ans,d[i]);
}
}
}
if (ans == INF) {
cout << -1 << endl;
} else {
cout << ans / 2 << endl;
}
return 0;
}