HDU-1829-A Bug's Life(向量偏移并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1829
题目大意:T组数据,每组数据n,m,m组配对,让你根据这m组虫子配对情况,判断这里面是否有同性恋(众所周知,正常的配对应该是两个不同性别的配对)
思路:这两天一直在看并查集,所以立马就想到用向量的方法写并查集的解决这个问题了。两个虫子之间的关系只有两种,
1.同性,2.异性,我们用0表示同性,1表示异性,然后就是板子了。
看过讨论区之后才发现,这道题是二分图判定的题,汗,反正我也不会二分图判定,以后就用这种方法把。
AC:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define Pair pair<int,int>
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
// std::ios::sync_with_stdio(false);
// register
const int MAXN=2010;
const int INF32=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const ll mod=1e9+7;
const double PI=acos(-1.0);
struct node{
int pre,relation;
}f[MAXN];
int n,m,flag;
void intt(){
for(int i=1;i<=n;++i){
f[i].pre=i;
f[i].relation=0;
}flag=0;
}
int Find(int a){
if(f[a].pre==a){
return a;
}int temp=f[a].pre;
f[a].pre=Find(f[a].pre);
f[a].relation=(f[temp].relation+f[a].relation)%2;
return f[a].pre;
}
int main(){
int T,Case=1;scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
int a,b;intt();
for(int i=1;i<=m;++i){
scanf("%d%d",&a,&b);
if(flag==1) continue;
int aa=Find(a),bb=Find(b);
if(aa==bb){//有同样的对象
if(f[a].relation==f[b].relation)
flag=1;//发现同性恋
}
if(aa!=bb){//对象不同
f[aa].pre=bb;
f[aa].relation=(2-f[a].relation+1+f[b].relation)%2;
}
}
if(flag) printf("Scenario #%d:\nSuspicious bugs found!\n\n",Case++);
else printf("Scenario #%d:\nNo suspicious bugs found!\n\n",Case++);
}
}