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";
}