제출 #1143570

#제출 시각아이디문제언어결과실행 시간메모리
1143570stdfloatBalanced Tree (info1cup18_balancedtree)C++20
23 / 100
4093 ms6528 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

#define ff	first
#define ss	second
#define pii	pair<int, int>

vector<int> c;

vector<vector<int>> E, dp;

void dfs1(int x, int p = -1) {
	for (auto i : E[x]) {
		if (i == p) continue;
		
		dfs1(i, x);

		dp[x][0] = min(dp[x][0], (!c[i] ? 0 : dp[i][0]) + 1);
		dp[x][1] = min(dp[x][1], (c[i] ? 0 : dp[i][1]) + 1);
	}
}

void dfs2(int x, int dp0 = (int)1e8, int dp1 = (int)1e8, int p = -1) {
	dp[x][0] = min(dp[x][0], dp0);
	dp[x][1] = min(dp[x][1], dp1);

	pair<pii, pii> a = {{-1, (int)1e8}, {-1, (int)1e8}}, b = a;
	for (auto i : E[x]) {
		if (i == p) continue;

		if (!~a.ss.ff || a.ss.ss > (!c[i] ? 0 : dp[i][0]) + 1) a.ss = {i, (!c[i] ? 0 : dp[i][0]) + 1};
		if (!~a.ff.ff || a.ff.ss > a.ss.ss) swap(a.ff, a.ss);

		if (!~b.ss.ff || b.ss.ss > (c[i] ? 0 : dp[i][1] + 1)) b.ss = {i, (c[i] ? 0 : dp[i][1]) + 1};
		if (!~b.ff.ff || b.ff.ss > b.ss.ss) swap(b.ff, b.ss);
	}

	(c[x] ? dp1 : dp0) = 0;

	for (auto i : E[x]) {
		if (i == p) continue;

		int ndp0 = (a.ff.ff != i ? a.ff.ss : a.ss.ss), ndp1 = (b.ff.ff != i ? b.ff.ss : b.ss.ss);
		dfs2(i, min(min(dp0, ndp0) + 1, (int)1e8), min(min(dp1, ndp1) + 1, (int)1e8), x);
	}
}

void solve() {
	int n;
	cin >> n;

	E.assign(n, {});
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y; x--; y--;

		E[x].push_back(y);
		E[y].push_back(x);
	}

	c.assign(n, 0);
	for (auto &i : c)
		cin >> i;

	vector<int> v;
	for (int i = 0; i < n; i++)
		if (!~c[i]) v.push_back(i);

	vector<int> ans;
	int mn = (int)1e8;
	for (int i = 0; i < 1 << (int)v.size(); i++) {
		for (int j = 0; j < (int)v.size(); j++)
			c[v[j]] = (i >> j) & 1;

		dp.assign(n, vector<int>(2, (int)1e8));
	 	dfs1(0);

	 	dfs2(0);

	 	int mx = 0;
	 	for (int i = 0; i < n; i++)
	 		mx = max(mx, dp[i][c[i]]);
	
	 	if (mx < mn) {
	 		mn = mx;
	 		ans = c;
	 	}
	}

 	if (mn == (int)1e8) cout << "-1\n";
 	else {
 		cout << mn << '\n';
 		for (auto i : ans)
 			cout << i << ' ';
 		cout << '\n';
 	}
}

int main() {
	ios::sync_with_stdio(false); cin.tie(nullptr);

	int T;
	cin >> T;
	while (T--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...