POJ 2236 Wireless Network 解题报告
解题思路:每个电脑都设置一个vector,储存离这个电脑距离在d以内的电脑标号,如果该电脑被修好,连接这些电脑到该电脑上。
#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<fstream>
#include<iomanip>
#include<vector>
#pragma warning(disable:4996)
#define INF 0x3f3f3f3f
#define ll long long
#define PI acos(-1.0)
const int N = 200010;
const int maxn = 1e5+10;
using namespace std;
int n, d;
int father[1005],visit[1005];
vector<int>v[1005];
struct node {
int x, y;
}pos[1005];
int find(int t)
{
while (t != father[t])
{
t = father[t];
}
return t;
}
void connect(int a, int b)
{
int m = find(a);
int n = find(b);
father[m] = n;
}
void solve(int x, int y)
{
int m = find(x);
int n = find(y);
if (m != n)
cout << "FAIL" << endl;
else
cout << "SUCCESS" << endl;
}
int main()
{
scanf("%d%d", &n, &d);
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &pos[i].x, &pos[i].y);
father[i] = i;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i == j)
continue;
double sum = sqrt((pos[j].x - pos[i].x) * (pos[j].x - pos[i].x) + (pos[j].y - pos[i].y) * (pos[j].y - pos[i].y));
if (sum <= d)
v[i].push_back(j);
}
}
char ch;
int id,x, y;
while (~scanf("%c", &ch))
{
if (ch == 'O')
{
scanf("%d", &id);
visit[id] = 1;
for (int i=0; i<v[id].size();i++)
{
int tem = v[id][i];
if (1 == visit[tem])
connect(id, tem);
}
}
else if (ch == 'S')
{
scanf("%d%d", &x, &y);
solve(x, y);
}
}
}