标签:
Description
Input
Output
Sample Input
4 1 0 1 0 2 0 3 0 4 O 1 O 2 O 4 S 1 4 O 3 S 1 4
Sample Output
FAIL SUCCESS
告诉几个点的坐标,O操作将电脑修复,S操作查询a,b两台电脑是否连通工作
#include <iostream> #include <stdio.h> #include <string> #include <cstring> #include <cmath> #include <algorithm> #define N 222222 using namespace std; struct Node { int x,y; int ff; }f[N]; int n,d; int fa[N]; int findfa(int x) { if(x==fa[x]) return fa[x]; return fa[x]=findfa(fa[x]); } double fun(int a,int b) { double ans; ans=(f[a].x-f[b].x)*(f[a].x-f[b].x)+(f[a].y-f[b].y)*(f[a].y-f[b].y); return ans; } void uniontwo(int a,int b) { int x=findfa(a); int y=findfa(b); if(x!=y) { if(x>y) fa[x]=y; else fa[y]=x; } } int main() { while(~scanf("%d %d",&n,&d)) { for(int i=1;i<=n;i++) scanf("%d %d",&f[i].x,&f[i].y); char ch[10]; for(int i=0;i<=n;i++) { fa[i]=i; f[i].ff=0; } while(~scanf("%s",ch)) { if(ch[0]=='O') { int a; for(int i=1;i<=n;i++) { scanf("%d",&a); f[a].ff=1; if((f[i].ff && fun(i,a)<=d*d*1.0)) { uniontwo(i,a); } } } else { int a,b; scanf("%d %d",&a,&b); if(findfa(a)==findfa(b)) cout<<"SUCCESS"<<endl; else cout<<"FAIL"<<endl; } } } return 0; }
POJ 2236Wireless Network (并查集)
标签:
原文地址:http://blog.csdn.net/wust_zjx/article/details/45201651