题解
题意:一个树n个节点,每个节点要么为粉色(-1)要么为黑色(1),从1开始走,每经过一个节点都会改变原来的颜色,问要使整棵树都是黑色的具体路径
可以不用回起点…orz…
看相邻两层就够了,
每当子节点为-1,需借父节点再走一遍,改变儿子的颜色,
特判节点1,如果节点1最后是-1,需要再借助其一个儿子,改变节点1的颜色,最后停在儿子节点上
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
vector<int> e[N];
int col[N];
void dfs(int u, int fa) {
for (int i = 0; i < e[u].size(); ++i) {
int v = e[u][i];
if (v == fa) continue;
col[v] = -col[v];
cout << v << ' ';
dfs(v, u);
col[u] = -col[u];
cout << u << ' ';
if (col[v] == -1) {
col[v] = -col[v];
cout << v << ' ';
col[u] = -col[u];
cout << u << ' ';
}
}
}
int main() {
ios::sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> col[i];
}
for (int i = 1, u, v; i < n; ++i) {
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
cout << 1 << ' ';
dfs(1, 0);
if (col[1] == -1) {
cout << e[1][0] << ' ';
cout << 1 << ' ';
cout << e[1][0] << ' ';
}
return 0;
}