zoukankan      html  css  js  c++  java
  • poj 2236 Wireless Network (并查集)

    给定N个坏掉的无线发射器坐标,给定其能相连通的最大距离,O i 代表修好第i个发射器,S i j 表示判断第i个和第j个是否能接通(可间接相连)。

    简单并查集应用,一个bool数组标记是否可用,每修好一个,找N个中已修好且可以直接相连的合并。最后判断i,j 是否都已修好且在同一个集合中即可。

    脑残的错,把make_set()放到n的输入之前了,找了N久N久。泪流满面啊...

    code:

    #include<cstdio>
    int node[1005][2] ;
    int p[1005] ;
    bool flag[1005] ;
    int n, d ;
    void make_set(){
        for(int i=0; i<=n; i++){
            p[i] = i ;
            flag[i] = false ;
        }
    }
    int find_set(int x){
        if(x!=p[x])
            p[x] = find_set(p[x]) ;
        return p[x] ;
    }
    void union_set(int x, int y){
        x = find_set(x) ;
        y = find_set(y) ;
        if(x!=y)
            p[y] = x ;
    }
    bool bfar(int x, int y){
        int a = node[x][0] - node[y][0] ;
        int b = node[x][1] - node[y][1] ;
        if(a*a+b*b<=d*d)
            return true ;
        return false ;
    }
    int main(){
        int i, x, y ;
        char c ;
        scanf("%d%d", &n, &d) ;
        make_set() ;
        for(i=1; i<=n; i++)
            scanf("%d%d", &node[i][0], &node[i][1]) ;
        getchar() ;
        while(~scanf("%c", &c)){
            if(c=='O'){
                scanf("%d", &x) ;
                flag[x] = true ;
                for(i=1; i<=n; i++)
                    if(bfar(x, i)&&flag[i])
                        union_set(x, i) ;
            }
            else{
                scanf("%d%d", &x, &y) ;
                if(find_set(x)==find_set(y)&&flag[x]&&flag[y])  printf("SUCCESS\n") ;
                else    printf("FAIL\n") ;
            }
            getchar() ;
        }
        return 0 ;


  • 相关阅读:
    Hbase王国游记之:Hbase客户端API初体验
    Hbase给初学者的“下马威”
    五分钟轻松了解Hbase面向列的存储
    JsonBuilder初出茅庐
    如何查看laravel门脸类包含方法的源码
    PHP常用数组函数
    Go语言strings包
    PHP获取远程http或ftp文件的md5值
    Git使用详细教程(9):git log
    PHP Iterator迭代对象属性
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2332539.html
Copyright © 2011-2022 走看看