https://www.luogu.org/problem/show?pid=1330
一开始往这个二分图的方向去想了会;
我靠看来题解发现仅仅是染色就好了;
唉,数据结构学傻了;
#include<bits/stdc++.h>
#define Ll long long
using namespace std;
const int N=1e4+5;
struct cs{int to,nxt;}a[N*30];
int f[N],head[N],ll,V[5];
int n,m,x,y,ans;
void init(int x,int y){
a[++ll].to=y;
a[ll].nxt=head[x];
head[x]=ll;
}
void dfs(int x,int v){
f[x]=v; V[v]++;
for(int k=head[x];k;k=a[k].nxt)
if(!f[a[k].to])dfs(a[k].to,3-v);else
if(f[a[k].to]==v){printf("Impossible");exit(0);}
}
int main()
{
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&x,&y);
init(x,y);init(y,x);
}
for(int i=1;i<=n;i++)
if(!f[i]){
V[1]=V[2]=0;
dfs(i,1);
ans+=min(V[1],V[2]);
}
printf("%d",ans);
}