poj 2236 Wireless Network 并查集

本文探讨了一道编程难题,涉及通过标记可用点、检查连通性和合并集合来解决图连通性问题。作者在实现过程中犯了一个错误,即在合并集合时直接修改了父亲节点,而不是正确地将一个点的父亲节点设置为另一个点的父亲节点。通过实例代码解析,解释了正确和错误的实现方式,并强调了理解并正确应用数据结构和算法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

           蛋疼,无比的蛋疼。。。。。这道题竟然花了一天的时间来做,考啊。。。。最后看了别人写的代码,大致思路是一致的,唯一的不同的一个点就是合并的时候,我把第i个点的父亲节点直接赋值成了另外一个点的父亲节点。。。。

这道题的大致思路是:就是给你N个点的坐标,O表示那些点能用,S是哪两个点是连通的。把能用的点标记出来,当下个能用的点出现时,找到当下这个点与那些标记出来的点连通的点,找到各自的父亲节点root1,root2,如果不同, parent【root1】 = parent【root2】,我就是在这个地方出的错,考。。。

代码如下:

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
struct node {
	int x,y,flag;
}s[1011];
int pa[1011];
int ve[1011];
int findset(int x) {
	return (x==pa[x]) ? x : pa[x]=findset(pa[x]);
}
void unionset(int a,int b) {
	int x=findset(a),y = findset(b);
	if(x==y) {
		printf("SUCCESS\n");
		return;
	}
	else printf("FAIL\n");
}
int main() {
	int n,k,i,p,q,b[1011];
	char c;
	scanf("%d%d",&n,&k);
	for(i=1; i<=n; i++) {
		scanf("%d%d",&s[i].x,&s[i].y);
		pa[i] = i;
		s[i].flag=0;
		ve[i]=0;
	}
	while(scanf("\n%c",&c)!=EOF) {
		if(c == 'O') {
			scanf("%d",&p);
			s[p].flag=1;
			for(i=1; i<=n; i++) {
				if(p!=i && ve[i]) {
						int va=findset(i);	
						int h=findset(p);
						if(va != h && (s[p].x-s[i].x)*(s[p].x-s[i].x)+(s[p].y-s[i].y)*(s[p].y-s[i].y)<=k*k) 
						 pa[va] = h;
				}
			}
			ve[p] = 1;
		}
		else {
			scanf("%d%d",&p,&q);
			 unionset(p,q);
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值