比赛 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;  
}