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;
}
posted @ 2018-08-10 02:00  秦宝宝&范可爱  阅读(140)  评论(0)    收藏  举报