POJ 2236 Wireless Network(並查集)
阿新 • • 發佈:2017-07-31
wireless pop 代碼 view ref algo pan sca i++
題目鏈接:
cid=66964#problem/A">[kuangbin帶你飛]專題五 並查集 A - Wireless Network
題意
有n臺損壞的電腦,現要將其逐臺修復,且使其相互恢復通信功能。若兩臺電腦能相互通信。則有兩種情況。一是他們之間的距離小於d。二是他們能夠借助都可到達的第三臺已修復的電腦。給出全部電腦的坐標位置,對其進行兩種可能的操作,O x表示修復第x臺。S x y表示推斷x y之間是否能通信,若能輸出SUCCESS,否則輸出FALL。
思路
用並查集來保存電腦互相的連通情況。
每次修好電腦後,將它能夠通信的電腦(距離滿足且已修好)與它進行連通。
代碼
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<algorithm>
#define LL long long
using namespace std;
const int N = 1009;
int x[N], y[N], fa[N];
bool p[N];
vector<int> v[N];
int find(int x)
{
if(fa[x] == x)
return x;
return fa[x] = find(fa[x]);
}
int main()
{
int n, d;
char s[2];
scanf("%d%d", &n, &d);
for(int i=1; i<=n; i++)
{
scanf("%d%d", &x[i], &y[i]);
fa[i] = i;
}
for(int i=1; i<=n; i++)
for(int j=i+1; j<=n; j++)
{
if (((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])) <= d*d)
{
v[j].push_back(i);
v[i].push_back(j);
}
}
while(~scanf("%s", s))
{
int a, b;
if(s[0] == ‘O‘)
{
scanf("%d", &a);
p[a] = true;
for(int i=0; i<v[a].size(); i++)
if(p[v[a][i]])
{
b = find(v[a][i]);
fa[b] = a;
}
}
else
{
scanf("%d%d", &a, &b);
int ta = find(a);
int tb = find(b);
if(ta == tb)
printf("SUCCESS\n");
else
printf("FAIL\n");
}
}
return 0;
}
POJ 2236 Wireless Network(並查集)