POJ 2236 (简单并查集) Wireless Network
2014-09-07 10:04
435 查看
题意:
有n个电脑坏掉了,分别给出他们的坐标
有两种操作,可以O x表示修好第x台电脑,可以 S x y表示x y是否连通
两台电脑的距离不超过d便可连通,两台电脑是连通的可以直接连通也可以间接通过第三台电脑连通
思路:
每次修好一台电脑都和前面已经修好的电脑比较一下如果距离小于d而且不在同一网络,便合并在一起即可
代码君
有n个电脑坏掉了,分别给出他们的坐标
有两种操作,可以O x表示修好第x台电脑,可以 S x y表示x y是否连通
两台电脑的距离不超过d便可连通,两台电脑是连通的可以直接连通也可以间接通过第三台电脑连通
思路:
每次修好一台电脑都和前面已经修好的电脑比较一下如果距离小于d而且不在同一网络,便合并在一起即可
//#define LOCAL #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 1000 + 10; struct Pos { int x, y; }pos[maxn]; int p[maxn], o[maxn]; int Find(int a) { return p[a] == a ? a : p[a] = Find(p[a]); } void Union(int a, int b) { int pa = Find(a); int pb = Find(b); if(pa != pb) p[pa] = pb; } int main(void) { #ifdef LOCAL freopen("2236in.txt", "r", stdin); #endif int n, d, a, b, cnt = 0; char cmd[10]; scanf("%d%d", &n, &d); for(int i = 0; i <= n; ++i) p[i] = i; memset(o, false, sizeof(o)); for(int i = 1; i <= n; ++i) scanf("%d%d", &pos[i].x, &pos[i].y); while(scanf("%s", cmd) != EOF) { if(cmd[0] == 'O') { scanf("%d", &a); o[cnt++] = a; for(int i = 0; i < cnt - 1; ++i) { if((pos[a].x-pos[o[i]].x)*(pos[a].x-pos[o[i]].x) + (pos[a].y-pos[o[i]].y)*(pos[a].y-pos[o[i]].y) <= d * d) { Union(a, o[i]); } } } else { scanf("%d%d", &a, &b); if(Find(a) == Find(b)) puts("SUCCESS"); else puts("FAIL"); } } return 0; }
代码君
相关文章推荐
- POJ 2236 Wireless Network 简单并查集
- POJ - 2236 简单的并查集
- POJ 2236 Wireless Network(简单并查集)
- Poj(2236),简单并查集
- POJ 2236 Wireless Network 【并查集的简单应用 判断是否在同一连通分量】
- poj2236 Wireless Network 简单并查集
- POJ - 2236 Wireless Network(简单并查集)
- POJ 2236 Wireless Network 【并查集的简单应用 判断是否在同一连通分量】
- poj 2236 Wireless Network (简单的并查集应用)
- POJ 8道简单的并查集 秒光了所有已知的简单并查集,总结一下,共8道。
- poj 1611(简单并查集的变形)
- POJ 2236 Wireless Network 并查集
- POJ2236 Wireless Network [并查集]
- poj 1611 The Suspects 初级->数据结构->简单并查集的应用
- POJ-2236 并查集
- POJ 1988 Cube Stacking【并查集的简单应用 堆木块】
- POJ 2236 Wireless Network(并查集)
- POJ---2524 Ubiquitous Religions[简单并查集]
- POJ 2236 Wireless Network (并查集)
- poj 2236 Wireless Network (并查集)