poj2236 Wireless Network (并查集)
一张图上分布着n台坏了的电脑,并知道它们的坐标。两台修好的电脑如果距离<=d就可以联网,也可以通过其他修好的电脑间接相连。给出操作“O x”表示修好x,给出操作“S x y”,请你判断x和y在此时有没有连接上。
#include <iostream> #include <cstring> using namespace std; int f[1010],x[1010],y[1010],vis[1010]; int n,d,l,r; char ch; void init(){ for(int i=0;i<=n;i++) f[i]=i; } int find(int i){ if(i!=f[i]) f[i]=find(f[i]); return f[i]; } bool dis(int a,int b){ int q=x[a]-x[b]; int p=y[a]-y[b]; if(q*q+p*p<=d*d) return true; return false; } int main() { cin>>n>>d; init(); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++){ cin>>x[i]>>y[i]; } while(cin>>ch){ if(ch=='O'){ cin>>r; vis[r]=1; for(int i=1;i<=n;i++){ if(i!=r&&vis[i]&&dis(i,r)){ int k1=find(r); int k2=find(i); f[k1]=k2; } } } else if(ch=='S'){ cin>>l>>r; int k1=find(l); int k2=find(r); if(k1==k2) cout<<"SUCCESS"<<endl; else cout<<"FAIL"<<endl; } } return 0; }