首页 > 其他 > 详细

洛谷P1330 封锁阳光大学 题解 DFS判二分图

时间:2020-05-01 22:16:53      阅读:52      评论:0      收藏:0      [点我收藏+]

题目链接:https://www.luogu.com.cn/problem/P1330

解题思路:DFS,判断每一个连通块是不是二分图。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
vector<int> g[maxn];
bool vis[maxn];
int n, m, u, v, cnt[2], color[maxn], ans;
bool dfs(int u, int c) {
    vis[u] = true;
    color[u] = c;
    cnt[c] ++;
    int sz = g[u].size();
    for (int i = 0; i < sz; i ++) {
        int v = g[u][i];
        if (!vis[v] && !dfs(v, !c)) {
            return false;
        }
        else if (vis[v] && color[v] == color[u]) {
            return false;
        }
    }
    return true;
}
int main() {
    cin >> n >> m;
    while (m --) {
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    for (int i = 1; i <= n; i ++) {
        if (!vis[i]) {
            cnt[0] = cnt[1] = 0;
            if (!dfs(i, 0)) {
                puts("Impossible");
                return 0;
            }
            else {
                ans += min(cnt[0], cnt[1]);
            }
        }
    }
    cout << ans << endl;
    return 0;
}

洛谷P1330 封锁阳光大学 题解 DFS判二分图

原文:https://www.cnblogs.com/quanjun/p/12814937.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!