1.bfs染色
void dfs(int x,int c){
mark[x]=c;
for(int i=0;i<edge[x].size();i++){
if(mark[edge[x][i]]==-1)dfs(edge[x][i],1-c);
else if(mark[edge[x][i]]==c)f=false;
}
}
2.并查集染色
int find(int x){
if(x!=par[x]){
int tmp=find(par[x]);
dis[x]+=dis[par[x]];
dis[x]%=2;
par[x]=tmp;
}return par[x];
}
for(int i=1;i<=m;i++){
int fa=find(a),fb=find(b);
if(fa==fb)
if(dis[a]==dis[b])f=false;
else{
par[fa]=fb;
dis[fa]=(dis[a]+dis[b]+1)%2;
}
}
3.影子并查集
int find(int x){
if(x==par[x])return x;
return par[x]=find(par[x]);
}
for(int i=1;i<=2*n;i++)par[i]=i;
while(m--){
int sa=a+n,sb=b+n;
int x1=find(a),x2=find(sa),y1=find(b),y2=find(sb);
if(x1==y1||x2==y2)f=false;
else par[y2]=x1,par[y1]=x2;
}