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

被折叠的 条评论
为什么被折叠?



