E. Split Into Two Sets

https://codeforces.com/problemset/problem/1702/E

题意:给定n个多米诺骨牌,n是偶数,每个牌子上写了两个数字。现在要把这些牌子分成两个set,每个set中的数字不能重复,问是否有解。

思路:把每个多米诺骨牌看出是一条边,问题转化为二分图染色。

总结:想不出来贪心为啥错的。。也不是很理解为啥要用二分图,直观的感受,如果一条边属于第一个set,那么前两个点都属于第一个set,但是二分图,愣是把一条边拆成了两个set,抽象。。

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

	vector<vector<int>> al(n + 1);
	vector<int> cnt(n + 1);
	bool ok = true;
	for (int i = 1; i <= n; ++i) {
		int u, v;
		cin >> u >> v;
		al[u].push_back(v);
		al[v].push_back(u);
		cnt[u] ++;
		cnt[v] ++;
		if (max(cnt[u], cnt[v]) > 2 || u == v) {
			ok = false;
		}
	}
	
	if (!ok) {
		cout << "NO\n";
		return;
	}

	vector<int> colors(n + 1, -1);
	auto dfs = [&](auto&& self, int u, int p)->bool{
		colors[u] = !colors[p];
		for (const auto& v : al[u]) {
			if (colors[v] != -1) {
				if (colors[v] != !colors[u]) {
					return false;
				}
			}
			else if (!self(self, v, u)) {
				return false;
			}
		}
		return true;
	};

	colors[0] = 1;

	for (int i = 1; i <= n; ++i) {
		if (colors[i] == -1 && !(dfs(dfs, i, 0))) {
			cout << "NO\n";
			return;
		}
	}

	cout << "YES\n";
}
posted @ 2025-07-29 10:27  _Yxc  阅读(8)  评论(0)    收藏  举报