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 ;


  • 相关阅读:
    手机端上传图片及java后台接收和ajaxForm提交
    JEECG中datagrid方法自定义查询条件
    微信分享到朋友圈按钮 右上角提示
    Js获取后台集合List的值和下标的方法
    redis系列之数据库与缓存数据一致性解决方案
    替换{0}为指定的字符串(MessageFormat)
    java中对array数组的常用操作
    面试题-Java Web-网络通信
    你应该知道的JAVA面试题
    各大互联网公司java开发面试常问问题
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2332539.html
Copyright © 2011-2022 走看看