POJ 2236 Wireless Network(提高)

题目链接:POJ 2236 Wireless Network

在这里插入图片描述

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>

using namespace std;
typedef long long ll;
const int maxn = 1010;
const int INF = 0x3f3f3f3f;
int father[maxn];
int repaired[maxn];		//存储修好的电脑的编号
struct point{
	int x;
	int y;
}p[maxn]; 

int n,d;

void init()		//初始化
{
	for(int i=1;i<=n;i++)
		father[i] = i;
}

double dis(int x1,int y1,int x2,int y2)		//求两点之间的距离
{
	double d = sqrt((double)(x2-x1)*(x2-x1) + (double)(y2-y1)*(y2-y1));
	return d;
}

int find(int x)
{
	if(x!=father[x])
		father[x] = find(father[x]);
	return father[x];
}

void Union(int x, int y)
{
	x = find(x);
	y = find(y);
	if(x!=y)
		father[y] = x;
}

bool judge(int x,int y)		//判断是否属于同一集合
{
    x = find(x);
    y = find(y);
    if(x==y)
        return true;
    else 
        return false;
}



int main()
{
	scanf("%d%d",&n,&d);
	
	for(int i=1;i<=n;i++)
		scanf("%d%d",&p[i].x,&p[i].y);
	
	init();
	
	char op;
	int num;
	int num1,num2;
	int cnt = 0;
	while(cin>>op)
	{
		if(op=='O')
		{
			scanf("%d",&num);
			repaired[++cnt] = num;	////存储修好的电脑的编号
			for(int i=1;i<=cnt;i++)		//每次都要从头查询 已修好的所有电脑
			{
				if(dis(p[repaired[i]].x, p[repaired[i]].y, p[num].x, p[num].y) <= double(d))
					Union(repaired[i], num);
			}
		}
		else
		{
			scanf("%d%d",&num1,&num2);
			if(judge(num1,num2))
				printf("SUCCESS\n");
			else
				printf("FAIL\n");
			
		}
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/90080319
今日推荐