洛谷P1330 封锁阳光大学 题解 DFS判二分图
题目链接: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;
}