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];
		}
	}
}
posted @ 2025-07-25 10:01  _Yxc  阅读(12)  评论(0)    收藏  举报