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