1. 程式人生 > >poj 2236 網絡連接問題 並查集

poj 2236 網絡連接問題 並查集

更改 space success str ring 相互 是否 成功 push_back

題意:n臺電腦,當兩臺之間的距離小於d的時候可以連接。 題目會進行操作“修復”還有“查詢是否已經連接”。只要在查詢的時候輸出YES或者ON

思路:

  1. 把可以相互連接的 即兩者之間的距離小於 d q[i].push_back(j) 還有 q[j].push_back(i) 這裏面的q為動態數組 q[i]存儲的是可以與i相連的機器
  2. 每臺機器的初始根節點為i
  3. 修復操作的時候,進行更改根節點,如果i,j都已經被修復了,那麽i j就可以連到同一個根節點上面
  4. 查詢操作的時候,如果兩者都在同一個根節點,就說明連接成功,否則連接失敗

解決問題的代碼:

#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\n"); else printf("FAIL\n"); } } }

poj 2236 網絡連接問題 並查集