Wireless Network(並查集(裸))
題目來源:https://vjudge.net/problem/POJ-2236
【題意】
因為地震,所有電腦都損壞,給出n個電腦的位置座標,然後說明只有在有限距離內兩臺電腦才能相互連線,一系列操作之後,多次詢問。
操作包括兩種: 1.成功修復一臺電腦。O +序號。
2.詢問x和y電腦是否相連。 S x y。
【思路】
給出一個修復好的電腦,就把它和所有可以連線的電腦連在一起。
【程式碼】
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int n;
double D;
int pre[1010];
struct pp
{
double x,y;
} s[1010];
bool dis(double x1,double y1,double x2,double y2)
{
double p=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return p<=D?1:0;
}
int find(int root)
{
if(root==pre[root])
return root;
else return pre[root]=find(pre[root]);
}
void MIX(int a,int b)
{
int fa=find(a);
int fb=find(b);
if(fa!=fb)
pre[fa]=fb;
}
int main()
{
scanf("%d%lf",&n,&D);
mem(pre,0);
for(int i=1; i<=n; i++)
scanf("%lf%lf%*c",&s[i].x,&s[i].y);
char p;
while(~scanf("%c",&p))
{
if(p=='O')
{
int m;
scanf("%d%*c",&m);
pre[m]=m;
for(int i=1; i<=n; i++)
if(pre[i]&&dis(s[i].x,s[i].y,s[m].x,s[m].y))
MIX(i,m);
}
else if(p=='S')
{
int m,ml;
scanf("%d%d%*c",&m,&ml);
if(find(m)==find(ml))
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
}
相關文章
- POJ 2236-Wireless Network(並查集)並查集
- 並查集到帶權並查集並查集
- 【並查集】【帶偏移的並查集】食物鏈並查集
- 並查集(一)並查集的幾種實現並查集
- 並查集(小白)並查集
- 3.1並查集並查集
- 並查集(Union Find)並查集
- 並查集應用並查集
- The Door Problem 並查集並查集
- 並查集練習並查集
- 並查集的使用並查集
- 並查集—應用並查集
- 寫模板, 並查集。並查集
- 並查集跳躍並查集
- 各種並查集並查集
- 並查集(二)並查集的演算法應用案例上並查集演算法
- The Suspects-並查集(4)並查集
- [leetcode] 並查集(Ⅰ)LeetCode並查集
- [leetcode] 並查集(Ⅱ)LeetCode並查集
- [leetcode] 並查集(Ⅲ)LeetCode並查集
- 並查集演算法並查集演算法
- 並查集深度應用並查集
- 【轉】種類並查集並查集
- 並查集java實現並查集Java
- 並查集-Java實現並查集Java
- 並查集題目合集並查集
- 並查集以及應用並查集
- 並查集的應用並查集
- 暢通工程(並查集)並查集
- (Day3)並查集並查集
- 並查集擴充套件並查集套件
- 簡單易懂的並查集演算法以及並查集實戰演練並查集演算法
- 關於並查集問題並查集
- 並查集的應用2並查集
- 並查集の進階用法並查集
- 並查集(UnionFind)技巧總結並查集
- 並查集應用總結並查集
- ZOJ 3789 Gears(並查集)並查集