5. Equal Tree Sums
阿新 • • 發佈:2022-03-25
題目連結:Equal Tree Sums
這是昨晚比賽中沒有做出來的一道題。讓你給一棵樹的所有節點賦值,使其刪去任意一個節點後產生的連通塊權值和均相等。
當時手畫了幾種簡單的情況,發現可以對樹二染色後交替賦正值和負值,但沒能構造出賦值的方案。
其實很簡單,染色後每條邊的兩端顏色必然不同,可以讓每條邊的總貢獻均為零,即每個點的權值的絕對值都是其度數,這樣刪去一個點就相當於將這個點的權值平均流到每個邊上去了,每個連通塊的權值之和就都是 \(1\) 或者 \(-1\)。
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; vector<int> g[maxn]; int ans[maxn]; void dfs(int u, int f, bool neg) { ans[u] = g[u].size(); if (neg) ans[u] = -ans[u]; for (auto v : g[u]) { if (v == f) continue; dfs(v, u, !neg); } } void solve() { int n; cin >> n; for (int i = 1, u, v; i < n; ++i) { cin >> u >> v; g[u].push_back(v), g[v].push_back(u); } dfs(1, 0, false); for (int i = 1; i <= n; ++i) { cout << ans[i] << " \n"[i == n]; g[i].clear(); } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T = 1; cin >> T; while (T--) { solve(); } }