zoukankan      html  css  js  c++  java
  • POJ2236-Wireless Network-并查集

    模板题

    对于每修复一台终端,就遍历所有其他已修复的终端,如果距离在d之内,就union。

    之后看是否在一个并查集中。

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    
    int N,D,pos[1010][2],rp[1010];
    int fa[1010];
    
    int Find(int x)
    {
        int r = x;
        while(r != fa[r])
            r = fa[r];
        int i=x,j;
        while(fa[i] != r)
        {
            j = fa[i];
            fa[i] = r;
            i = j;
        }
        return r;
    }
    
    void Union(int x,int y)
    {
        int fx = Find(x),fy = Find(y);
        if(fx != fy)
            fa[fy] = fx;
    }
    
    int dis(int x,int y)
    {
        return abs(pos[x][0]-pos[y][0])*abs(pos[x][0]-pos[y][0])+abs(pos[x][1]-pos[y][1])*abs(pos[x][1]-pos[y][1]);
    }
    
    int main()
    {
        scanf("%d%d",&N,&D);
        for(int i=1;i<=N;i++)
        {
            scanf("%d%d",&pos[i][0],&pos[i][1]);
            fa[i] = i;
        }
        char op[5];
        int p,q;
        while(~scanf("%s",op))
        {
            if(op[0] == 'O')
            {
                scanf("%d",&p);
                rp[p] = 1;
                for(int i=1;i<=N;i++)if(i!=p &&rp[i]&&dis(i,p)<=D*D)
                {
                    Union(i,p);
                    //printf("link %d %d
    ",i,p);
                }
            }
            else if(op[0] == 'S')
            {
                scanf("%d%d",&p,&q);
                if(rp[p] && rp[q] && Find(p) == Find(q)) printf("SUCCESS
    ");
                else printf("FAIL
    ");
            }
        }
    }
  • 相关阅读:
    SpringBoot打jar包以及打成war包 (springboot2.0)
    学习软件开发的心得
    SQA计划
    继续冲吧
    别跑了,看看脚下有木有money
    springIOC的那些事
    ssm
    scrum 第二次冲刺
    云医院
    团队项目开发总结
  • 原文地址:https://www.cnblogs.com/helica/p/5176585.html
Copyright © 2011-2022 走看看