两个和谐河蟹不能在同一条边的两端。所以对于每条边。只有一个节点有和谐河蟹
所以说,我们可以将有和谐河蟹的看做一种颜色,或则是状态。没有河蟹看做另一种言颜色
这样边变成了二分图染色
所以嗯~(???)
就可以dfs暴力染色,不过要注意。有可能有多个图
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int point;
int nxt;
};//链表
node line[201000];
int head[10100],tail;
void add(int a,int b)
{
line[++tail].point=b;
line[tail].nxt=head[a];
head[a]=tail;
}
int color[10100];//染色
int turn[3]={0,2,1};//颜色转换
int t[3];//每种颜色的使用次数
bool flag=false;
void dfs(int x,int c)
{
color[x]=c;
t[c]+=1;
int need=head[x];
while(need!=0)
{
if(!color[line[need].point])
dfs(line[need].point,turn[c]);
if(color[line[need].point]==c||flag)
{
flag=true;
t[1]=-0x7fffffff;
return ;//返回负无穷
}
need=line[need].nxt;
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int a,b;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(!color[i])
{
t[1]=t[2]=0;
dfs(i,1);
ans+=min(t[1],t[2]);//挑一个小的加
if(ans<0)//就是dfs中无法二分图染色
{
printf("Impossible");
return 0;
}
}
}
printf("%d",ans);
}