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