poj 2236 Wireless Network

本文通过一道编程题详细介绍了并查集算法的应用场景与实现细节。重点在于如何使用并查集来判断图中的两个节点是否属于同一集合,并分享了调试过程中遇到的坑点。

http://162.105.81.212/JudgeOnline/problem?id=2236

并查集

ps: WA得要死, 后来才发现原来是: 求两点间距离时用的距离的平方, 而输入的d却忘记平方了, orz...orz

更可恶的是, 测试样例中, 两点间的最小距离都是1, d=1, 平不平方都无所谓.....orz

#include<iostream> using namespace std; #define MAX 1002 int N, d; int father[MAX]; int add[MAX]; bool isAdd[MAX]; struct POINT { int x, y; }point[MAX]; void init() { for(int i=1; i<=N; i++) father[i] = i; } inline int getDist(POINT a, POINT b) { return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); } int getFather(int x) { if(x != father[x]) father[x] = getFather(father[x]); return father[x]; } int main() { //freopen("in.txt", "r", stdin); int i, num = 0; int id, go, to, dist; int father_a, father_b; char op; scanf("%d%d", &N, &d); d *= d; init(); memset(isAdd, 0, sizeof(isAdd)); for(i=1; i<=N; i++) scanf("%d%d", &point[i].x, &point[i].y); scanf("%*c"); while(scanf("%c", &op) != EOF) { if(op == 'O') { scanf("%d", &id); if(isAdd[id] == 0) { isAdd[id] = 1; add[num] = id; for(i=0; i<num; i++) { dist = getDist(point[id], point[add[i]]); if(dist <= d) { father_a = getFather(id); father_b = getFather(add[i]); if(father_a != father_b) father[father_a] = father_b; } } num++; } } else if(op == 'S') { scanf("%d%d", &go, &to); if(getFather(go) != getFather(to)) puts("FAIL"); else puts("SUCCESS"); } scanf("%*c"); } return 0; }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值