封锁阳光大学
2024年12月25日小于 1 分钟
#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> e[10000 + 5];
// 0 未编号、1/2 编号
int tag[10000 + 5];
int cntAll; // 当前连通块大小(被标记的数量)
int cnt1; // 当前连通块被标记了 1 的数量
// 当前点为 now,应该被标记上 num
void dfs(int now, int num)
{
// 已经被标记过
if (tag[now] != 0)
{
if (tag[now] != num)
{
cout << "Impossible";
exit(0);
}
return;
}
// 没有被标记过
tag[now] = num;
cntAll++;
if (num == 1)
cnt1++;
for (int i = 0; i < e[now].size(); i++)
{
int nxt = e[now][i];
dfs(nxt, 3 - num);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int u, v;
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
if (tag[i] == 0)
{
cntAll = 0;
cnt1 = 0;
dfs(i, 1);
ans += min(cnt1, cntAll - cnt1);
}
}
cout << ans;
return 0;
}