HDU 1829 A Bug's Life

来源:互联网 发布:手机淘宝怎样用信用卡 编辑:程序博客网 时间:2024/05/22 15:15

题目输入N和M,N表示小虫的数目(编号为1~N),M表示关系的数目,接下来的M行关系A B表示A和B相互吸引,题目假设只有异性的虫才会互相吸引,要求我们根据输入判断假设是否成立,由于不知道每条虫的性别,所以只要没有明显的同性相吸引(如:A与B相互吸引,B与C相互吸引,且A与C也相互吸引),就算假设成立。

很裸的并查集,开多一个数组oppo记录与每条虫性别不同的虫的编号。

输入一个关系A B

(1)如果A和B性别相同(同一个集合),则假设不成立,否则执行步骤(2);

(2)如果之前已经有虫C和虫A是不同的性别(不同的集合),则合并虫C和虫B所在的集合,否则执行步骤(3);

(3)如果之前已经有虫C和虫B是不同的性别,则合并虫C和虫A所在的集合,否则执行步骤(4);

(4)oppo[虫A的编号]=虫B的编号,oppo[虫B的编号]=虫A的编号。


109ms AC


#include <stdio.h>#define MAXN 2000int p[MAXN+5],rank[MAXN+5],oppo[MAXN+5];void scani(int &num){char ch;int flag=1;while(ch=getchar(),(ch>'9'||ch<'0')&&(ch!='-'));if(ch=='-')flag=-1,num=0;elsenum=ch-'0';while(ch=getchar(),ch<='9'&&ch>='0')num=num*10+ch-'0';num*=flag;}int find(int x){int r,t,i;r=x;while(r!=p[r])r=p[r];i=x;while(i!=r){t=p[i];p[i]=r;i=t;}return r;}void merge(int ra,int rb){if(rank[ra]==rank[rb]){p[rb]=ra;rank[ra]++;}else{if(rank[ra]>rank[rb])p[rb]=ra;elsep[ra]=rb;}}void init(int n){int i;for(i=1;i<=n;i++)p[i]=i,rank[i]=oppo[i]=0;}int main(){int T,cas,a,b,ra,rb,rt,n,m;bool flag;scani(T);for(cas=1;cas<=T;cas++){flag=0;scani(n),scani(m);init(n);while(m--){scani(a),scani(b);if(flag)continue;ra=find(a),rb=find(b);if(ra==rb)flag=1;else{if(oppo[a]){rt=find(oppo[a]);if(rt!=rb)merge(rt,rb);}else{if(oppo[b]){rt=find(oppo[b]);if(rt!=ra)merge(rt,ra);}elseoppo[a]=b,oppo[b]=a;}}}printf("Scenario #%d:\n",cas);puts(flag?"Suspicious bugs found!":"No suspicious bugs found!");puts("");}return 0;}



原创粉丝点击