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> al(n + 1);
vector 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 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  阅读(21)  评论(0)    收藏  举报