poj2492(带权并查集)

题目链接:http://poj.org/problem?id=2492

题意:给出n个人,m条关系,每条关系表示的两个人异性,判断这m条关系是否有误。

思路:带权并查集,类似poj1182,并查集的向量应用。用1表示x,y异性,0表示同性,不访用f(x,y)表示x,y的关系。容易得出f(x,z)=f(x,y)^f(y,z),之后就好做了。输入一组关系t1,t2,用r1,r2表示其祖先,若相等则查询,即f[t1]与f[t2]是否相等; 若不等,则合并,f[r2]=1^f[t1]^f[t2](手动模拟一下)。

AC代码:

 1 #include<cstdio>
 2 using namespace std;
 3 
 4 int cas,n,m,root[2005],f[2005];
 5 
 6 int getr(int k){
 7     if(root[k]==k) return k;
 8     else{
 9         int tmp=root[k];
10         root[k]=getr(root[k]);
11         f[k]^=f[tmp];
12         return root[k];
13     }
14 }
15 
16 int main(){
17     scanf("%d",&cas);
18     for(int i=1;i<=cas;++i){
19         bool flag=true;
20         scanf("%d%d",&n,&m);
21         for(int j=1;j<=n;++j)
22             root[j]=j,f[j]=0;
23         for(int j=1;j<=m;++j){
24             int t1,t2,r1,r2;
25             scanf("%d%d",&t1,&t2);
26             if(flag){
27                 r1=getr(t1),r2=getr(t2);
28                 if(r1==r2){
29                     if(f[t1]==f[t2])
30                         flag=false;
31                 }
32                 else{
33                     root[r2]=r1;
34                     f[r2]=1^f[t2]^f[t1];
35                 }
36             }
37         }
38         printf("Scenario #%d:\n",i);
39         if(flag)
40             printf("No suspicious bugs found!\n\n");
41         else
42             printf("Suspicious bugs found!\n\n");
43     }
44     return 0;
45 }

 

转载于:https://www.cnblogs.com/FrankChen831X/p/10654366.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值