题意:一组昆虫性别有公有母,现给出一组交配信息,问是否有同性恋发生。
思路:1、并查集。维护一个性别数组。关键代码见注释!
2、二分图着色判断是否为二分图。也就是在交配的虫子之间连边,判断每一个连通分量是否为二分图。
#include <stdio.h>
#include <string.h>
#define N 2005
int f[N],gender[N];
int c,n,m,T;
int find(int x){
int temp = f[x];
if(f[x] == x)
return x;
f[x] = find(f[x]);
gender[x] = gender[x] ^ gender[temp];//根据父节点的性别是否变化更新自己的(也就是一条链顶端节点性别变化,后边的跟着变化)
return f[x];
}
int main(){
freopen("a.txt","r",stdin);
scanf("%d",&T);
for(c = 1;c<=T;c++){
int i,j,x,y,xx,yy,flag = 0;
scanf("%d %d",&n,&m);
for(i = 1;i<=n;i++)
f[i] = i;
memset(gender,0,sizeof(gender));
for(i = 0;i<m;i++){
scanf("%d %d",&x,&y);
if(flag)
continue;
xx = find(x);
yy = find(y);
if(xx == yy)