题意:n台电脑,当两台之间的距离小于d的时候可以连接。 题目会进行操作“修复”还有“查询是否已经连接”。只要在查询的时候输出YES或者ON
思路:
- 把可以相互连接的 即两者之间的距离小于 d q[i].push_back(j) 还有 q[j].push_back(i) 这里面的q为动态数组 q[i]存储的是可以与i相连的机器
- 每台机器的初始根节点为i
- 修复操作的时候,进行更改根节点,如果i,j都已经被修复了,那么i j就可以连到同一个根节点上面
- 查询操作的时候,如果两者都在同一个根节点,就说明连接成功,否则连接失败
解决问题的代码:
#include <iostream> #include <cstdio> #include <vector> #include <algorithm> #include <string.h> using namespace std; const int N = 1009; int x[N], y[N], fa[N]; bool p[N]; vector<int> v[N]; int Find(int x) { if (fa[x] == x) return x; return fa[x] = Find(fa[x]); } int main() { int n, d; char s[2]; memset(p, 0, sizeof(p)); scanf("%d%d", &n, &d); for (int i = 1; i <= n; i++) { scanf("%d%d", &x[i], &y[i]); fa[i] = i; } for (int i = 1; i <= n; i++) for (int j = i + 1; j <= n; j++) if (((x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j])*(y[i] - y[j])) <= d * d) { v[i].push_back(j); v[j].push_back(i); } while (~scanf("%s", s)) { int a, b; if (s[0] == '0') { scanf("%d", &a); p[a] = true; for (int i = 0; i < v[i].size(); i++) { if (p[v[a][i]]) { b = Find(v[a][i]); fa[b] = a; } } } else { scanf("%d%d", &a, &b); int dx = Find(a); int dy = Find(b); if (dx == dy) printf("SUCCESS "); else printf("FAIL "); } } }