• 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 ;


  • 相关阅读:
    常用的设计模式汇总
    设计模式总结
    C# WinForm文章收集
    SQL Server 2012/2016/2017 新增函数
    SQL Server 日期函数大全
    【BZOJ3622】已经没有什么好害怕的了
    【SDOI2009】Bill的挑战
    【HDU4507】恨7不成妻
    BSOJ 2423 -- 【PA2014】Final Zarowki
    BSOJ 4591 -- 【JLOI2015】城池攻占
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2332539.html
Copyright © 2020-2023  润新知