现在的位置: 首页 > 综合 > 正文

poj 2236 Wireless Network (并查集)

2012年12月05日 ⁄ 综合 ⁄ 共 1334字 ⁄ 字号 评论关闭

给定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 ;

抱歉!评论已关闭.