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);
}
posted @ 2025-07-19 09:31  _Yxc  阅读(4)  评论(0)    收藏  举报