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<int>> 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<bool> colors(n + 1);
vector<bool> vis(n + 1);
for (int i = 1; i <= n; ++i) {
if (!vis[i]) {
bool ok = true;
vis[i] = true;
colors[i] = true;
queue<int> 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<int> 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<int>& 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);
}

浙公网安备 33010602011771号