蛋疼,无比的蛋疼。。。。。这道题竟然花了一天的时间来做,考啊。。。。最后看了别人写的代码,大致思路是一致的,唯一的不同的一个点就是合并的时候,我把第i个点的父亲节点直接赋值成了另外一个点的父亲节点。。。。
这道题的大致思路是:就是给你N个点的坐标,O表示那些点能用,S是哪两个点是连通的。把能用的点标记出来,当下个能用的点出现时,找到当下这个点与那些标记出来的点连通的点,找到各自的父亲节点root1,root2,如果不同, parent【root1】 = parent【root2】,我就是在这个地方出的错,考。。。
代码如下:
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
struct node {
int x,y,flag;
}s[1011];
int pa[1011];
int ve[1011];
int findset(int x) {
return (x==pa[x]) ? x : pa[x]=findset(pa[x]);
}
void unionset(int a,int b) {
int x=findset(a),y = findset(b);
if(x==y) {
printf("SUCCESS\n");
return;
}
else printf("FAIL\n");
}
int main() {
int n,k,i,p,q,b[1011];
char c;
scanf("%d%d",&n,&k);
for(i=1; i<=n; i++) {
scanf("%d%d",&s[i].x,&s[i].y);
pa[i] = i;
s[i].flag=0;
ve[i]=0;
}
while(scanf("\n%c",&c)!=EOF) {
if(c == 'O') {
scanf("%d",&p);
s[p].flag=1;
for(i=1; i<=n; i++) {
if(p!=i && ve[i]) {
int va=findset(i);
int h=findset(p);
if(va != h && (s[p].x-s[i].x)*(s[p].x-s[i].x)+(s[p].y-s[i].y)*(s[p].y-s[i].y)<=k*k)
pa[va] = h;
}
}
ve[p] = 1;
}
else {
scanf("%d%d",&p,&q);
unionset(p,q);
}
}
return 0;
}