vickey

岁月静和,微笑向暖

poj 1703 Find them,Catch them 并查集

http://poj.org/problem?id=1703

f[] 先清为-1  则 set_find(x]=x;

一开始: n=5;

x:  1 2 3 4 5 6 7 8 9 10

f:  1 2 3 4 5 6 7 8 9 10

  f[](包含的元素)
d:1 2后: 3{3};  4{4}; 5{5}; 6{2,6} 7{1,7} ; 8{8}; 9{9}; 10{10};

f[1]!=f[2] 在不同集合

d: 2 4 后: 3{3} ..5{5}..7{1,4,7} 8{2,6,8}; 9{9}; 10{10}

f[1]=f[4]=7 在同一集合

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<set>
#include<queue>
#include<map>
#include<vector>
using namespace std;
const int size=100010;
int f[size*2];
int set_find(int x)
{
   if(f[x]<0) return x;
   else f[x]=set_find(f[x]);
}

int  main()
{
//    freopen("in.in","r",stdin);
   int T;
   scanf("%d",&T);
   while(T--)
   {
     int n,m;
     scanf("%d%d",&n,&m);
     memset(f,-1,sizeof(f));
     char c;
     int a,b;
     while(m--)
     {
        scanf("%s%d%d",&c,&a,&b);
        int fa=set_find(a);
        int fb=set_find(b);
//        printf("fd==%d  fb=%d\n",fa,fb);
        if(c=='D'){
           if(fa!=set_find(b+n)){
               f[fa]=set_find(b+n);
               f[fb]=set_find(a+n);
//               printf("d:f[%d]==%d  f[%d]=%d\n",fa,f[fa],fb,f[fb]);
          }
        }
        else {
            if(fa==fb) printf("In the same gang.\n");
            else if(fa!=fb&&fa!=set_find(b+n)) printf("Not sure yet.\n");
            else printf("In different gangs.\n");
        }
     }
   }

    return 0;
}




阅读更多
个人分类: 并查集
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭