A. NP-Hard Problem

https://codeforces.com/problemset/problem/687/A

题意:判断是否是二分图,并输出顶两个顶点的集合

总结:bsf直接遍历即可,然后将v和u设置为相反的颜色,如果有冲突,则不行,如果没冲突,就可以。下次可以取消vis,直接开个int数组记录0和1颜色,然后初始化为-1,就看有没有访问过就行了,数据多了看着乱。

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

vector<vector> al(n + 1);
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v;

al[u].push_back(v);
al[v].push_back(u);
}

vector colors(n + 1);
vector vis(n + 1);

for (int i = 1; i <= n; ++i) {
if (!vis[i]) {
bool ok = true;
vis[i] = true;
colors[i] = true;
queue q;
q.push(i);
while (!q.empty()) {
auto u = q.front();
q.pop();
for (const auto& v : al[u]) {
if (!vis[v]) {
colors[v] = !colors[u];
vis[v] = true;
q.push(v);
}
else if (colors[v] == colors[u]) {
ok = false;
break;
}
}
}
if (!ok) {
cout << "-1\n";
return;
}
}
}

vector a, b;
a.reserve(n);
b.reserve(n);
for (int i = 1; i <= n; ++i) {
if (!vis[i]) {
continue;
}
if (colors[i]) {
a.push_back(i);
}
else {
b.push_back(i);
}
}

auto print = [](const vector& v){
cout << v.size() << '\n';
for (int i = 0; i < (int)v.size(); ++i) {
cout << v[i] << " \n"[i == (int)v.size() - 1];
}
};
print(a);
print(b);
}

posted @ 2025-07-19 09:31  _Yxc  阅读(19)  评论(0)    收藏  举报