A - Wireless Network

传送门:Wireless Network
在这里插入图片描述
在这里插入图片描述
题意:题目说的是给出一些坏电脑的坐标,再给出任意个操作,操作为修复一台电脑,或者判断两台电脑是否可以联网。
思路:可以当做并查集模板题来做,很简单。我们需要三个数组,一个来记录电脑坐标,一个来记录电脑是否修好了,最后一个来记录该电脑的的祖宗节点电脑。

第一种操作"O p" (1 <= p <= N),其实就是记录哪台电脑修好以及合并集合的过程;
第二种操作 “S p q” (1 <= p, q <= N),就是询问两个电脑所在的集合是否相同,相同输出"SUCCESS",否则输出"FAIL"。

代码

#include<iostream>
#include<stdio.h>
using namespace std;
struct node{
	int x,y;
}a[1005];
int f[1005];//祖宗节点数组
int n,d;
bool vis[1005];//标记电脑是否修好了
int find(int x)//查找祖宗节点并返回祖宗节点
{
	if(f[x]!=x) f[x]=find(f[x]);
	return f[x];
}
int jisuan(int i,int j)
{
	return (a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y);
}
int main()
{
	
	cin>>n>>d;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&a[i].x,&a[i].y);
	}
	char s[3];
	
	for(int i=1;i<=n;i++)
	f[i]=i;
	while(scanf("%s",s)!=EOF)
	{
		if(s[0]=='O')
		{
			int k;
			scanf("%d",&k);
			if(vis[k]) continue;
			vis[k]=1;
			for(int i=1;i<=n;i++)
			{
				if(jisuan(i,k)<=d*d&&vis[i])
				{
					if(find(i)!=find(k))//判断条件可要可不要
					f[find(i)]=find(k);
				}
			}
			
		}
		else{
			int p,q;
			scanf("%d%d",&p,&q);
			if(find(p)==find(q))
			{
				puts("SUCCESS");
			}
			else puts("FAIL");
		}
	}
	return 0;	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值