题目描述 https://www.luogu.org/problem/P1330
染色问题
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=2e4+4,M=2e5+5;
int h[N],to[M],next[M],tot;
void add(int x,int y)
{
to[++tot]=y;
next[tot]=h[x];
h[x]=tot;
}
int n,m,col[N],sum[2],ans;
bool fl[N];
bool dfs(int x,int color)
{
if(fl[x])
{
if(col[x]==color) return true;
return false;
}
fl[x]=true;
sum[col[x]=color]++;
bool tf=true;
for(int i=h[x];i;i=next[i])
{
tf=tf&&dfs(to[i],1-color);
}
return tf;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
}
for(int i=1;i<=n;i++)
{
if(fl[i]) continue;
sum[0]=sum[1]=0;
if(!dfs(i,0))
{
printf("Impossible");
return 0;
}
ans+=min(sum[0],sum[1]);
}
printf("%d",ans);
return 0;
}