POJ 2236Wireless Network (并查集)
Description
In the process of repairing the network, workers can take two kinds of operations at every moment, repairing a computer, or testing if two computers can communicate. Your job is to answer all the testing operations.
Input
1. "O p" (1 <= p <= N), which means repairing computer p.
2. "S p q" (1 <= p, q <= N), which means testing whether computer p and q can communicate.
The input will not exceed 300000 lines.
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; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。