C. Not Assigning
https://codeforces.com/problemset/problem/1627/C
题意:给定一棵树,现在要给树的每个边设一个权重,要求树的每个长度<=2的路径中的权重和为质数,求每个边的权重。
思路:存储每个边的id,然后做dfs,判断当前的树是否是一条直线,如果是,则按照遍历顺序将2和5依次添加到边中。如果不是,则无解,因为想要满足题意,在这条直线中不能有分叉,如果有分叉,就无法构造出prime tree(testcase得来的灵感)
总结:题目晦涩难懂,感觉英语阅读水平越来越差了啊。
inline void solve() {
int n;
cin >> n;
vector<vector<int>> al(n + 1);
map<pair<int, int>, int> edges;
for (int i = 0; i < n - 1; ++i) {
int u, v;
cin >> u >> v;
al[u].push_back(v);
al[v].push_back(u);
edges[{u, v}] = edges[{v, u}] = i;
}
vector<int> ans(n + 1);
int now = 2;
auto dfs = [&](auto&& self, int u, int p) ->bool{
if (al[u].size() > 2) {
return false;
}
ans[edges[{p, u}]] = now;
now = now == 2 ? 5 : 2;
for (const auto& v : al[u]) {
if (v == p) {
continue;
}
if (!self(self, v, u)) {
return false;
}
}
return true;
};
int s = 0;
for (int i = 1; i <= n; ++i) {
if (al[i].size() == 1) {
s = i;
break;
}
}
if (s == 0) {
cout <<"-1\n";
return;
}
if (!dfs(dfs, s, 0)) {
cout << "-1\n";
}
else {
for (int i = 0; i < n - 1; ++i) {
cout << ans[i] << " \n"[i == n - 2];
}
}
}

浙公网安备 33010602011771号