稍稍找回了点信心,昨晚上那题直接让我产生了我不会并查集的幻觉。。。。现在还在纠结为啥我的程序和标程雷同依然wa。。。。
#include<iostream>
#include<cstdio>
using namespace std;
int n,d,p,q,sets[2000],nodes[2000][2];
bool repaired[2000],relation[2000][2000];
char c;
int find(int x){
int y=sets[x];
if(x==sets[x]) return x;
else{
y=find(sets[x]);
sets[x]=y;
return y;
}
}
int hpow(int x){
return x*x;
}
void union_set(int x,int y){
int a,b;
a=find(x);
b=find(y);
sets[b]=a;
}
int main(){
cin>>n>>d;
d=d*d;
for(int i=0;i<=n;i++){
repaired[i]=false;
sets[i]=i;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
relation[i][j]=false;
}
for(int i=1;i<=n;i++){
cin>>nodes[i][0]>>nodes[i][1];
}
for(int i=1;i<n;i++)
for(int j=i;j<=n;j++)
if(i!=j){
if(hpow(nodes[i][0]-nodes[j][0])+hpow(nodes[i][1]-nodes[j][1])<=d){
relation[i][j]=relation[j][i]=true;
}
}
while(cin>>c){
if(c=='S'){
cin>>p>>q;
if(find(p)==find(q)) cout<<"SUCCESS"<<endl;
else cout<<"FAIL"<<endl;
}
else if(c=='O'){
cin>>p;
repaired[p]=true;
for(int i=1;i<=n;i++)
if(repaired[i]&&i!=p&&relation[i][p])
union_set(i,p);
}
}
return 0;
}