poj2492
题目链接
http://poj.org/problem?id=2492
题目大意
一个物种的个体只有两种性别,(A B)表示A与B杂交,问是否有同性恋
t组测试数据(1<=t<=2000),n只个体,m次杂交 (1<=n,m<=1000000)
样例
输入
2
3 3
1 2
2 3
1 3
4 2
1 2
3 4
输出
Scenario #1:
Suspicious bugs found!
Scenario #2:
No suspicious bugs found!
思路
并查集
并查集的修改: 要对父亲进行修改,而不是自身
还要考虑性别(一开始考虑的是相邻的奇数与偶数,然后被小宝宝安利了异或)
异或: 遇见1就翻转。2(10)^1=3(11) ,5(110)1=6(111),9(1111)1=8(1000);
输出有字符串注意大小写和换行(noip经验:pdf文档不要复制粘贴会有乱码)
if的赋值可以这样写: (条件)?(满足):(不满足);
div: 向下取整
a++: 先赋值a,然后a+1
continue: 只退出当前循环操作(break则退出全部),另外注意拼写
弱智代码
#include<cstdio>
int f[8000],n,m,q,x,y,fx,fy,num;
bool ff;
int find(int p){
return (p!=f[p])?f[p]=find(f[p]):f[p];
}
int change(int a,int b,int fa,int fb){
if(fb<=n){//a和b都没有统计性别
f[a]=num++;
f[b]=num++;
}else{// b统计过性别
f[fa]=fb^1;// a为b异性
if(fa>n)f[fa^1]=fb; //a统计过性别,修改a的异性
}
return 0;
}
int main(){
//freopen("poj2492.in","r",stdin);
//freopen("poj2492.out","w",stdout);
scanf("%d",&q);
for(int i=1; i<=q; ++i){
scanf("%d%d",&n,&m);
for(int j=1; j<=2*n; ++j)f[j]=j;
ff=false;
num=(n%2)?(n+1):(n+2);
for(int j=1; j<=m; ++j){
scanf("%d%d",&x,&y);
if(ff)continue;
fx=find(x);
fy=find(y);
if(fx==fy){ff=true; continue;}//同性
if(fx<fy)change(x,y,fx,fy);//强行要求子程序中fb大
else change(y,x,fy,fx);
}
printf("Scenario #%d:\n",i);
if(ff)printf("Suspicious bugs found!\n\n");
else printf("No suspicious bugs found!\n\n");
}
return 0;
}

浙公网安备 33010602011771号