1. 程式人生 > >poj2236(並查集)

poj2236(並查集)

兩臺電腦 tro 互相連接 ini target 關於 org 連接 getchar()

題目鏈接:http://poj.org/problem?id=2236

題意:

  關於電腦之間的連接問題,給出一個距離限制,一臺電腦與一臺電腦是連接的有兩種情況,一種是他們之間的距離小於限制距離,另一種是他們之間的距離超過了限制距離,但是他們間接通過其他在限制距離內的電腦互相連接。當然要連接的話首先要保證電腦是激活的狀態,然後S表示詢問,叫你判斷詢問的兩臺電腦之間是否連接。

思路:

  簡單的並查集做法,只是合並的時候加上判斷條件,首先在距離內的才能直接連接,還有只有連接的兩臺電腦都處於激活狀態。水~

代碼:

 1 #include<iostream>
 2 #include<stdio.h>
 3
#include<cmath> 4 using namespace std; 5 6 int fa[1010]; 7 int n, max_dis; 8 9 struct Num 10 { 11 int id; 12 int x; 13 int y; 14 int flag; //判斷是否修復 15 } num[1010]; 16 17 int dis(Num a, Num b) //計算距離,返回的是距離的平方 18 { 19 return ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
20 } 21 22 void init(int n) 23 { 24 for(int i = 1; i <= n; i++) 25 { 26 num[i].id = i; 27 fa[i] = i; 28 num[i].flag = 0; 29 } 30 return; 31 } 32 33 int find(int x) 34 { 35 return (fa[x] == x ? x : (fa[x] = find(fa[x]))); 36 } 37 38 void unite(Num a, Num b)
39 { 40 int r1 = find(a.id); 41 int r2 = find(b.id); 42 if(r1 == r2) 43 { 44 return; 45 } 46 else 47 { 48 if(dis(a, b) <= (max_dis * max_dis)) 49 { 50 fa[r2] = r1; 51 } 52 } 53 } 54 55 int main() 56 { 57 ios::sync_with_stdio(false); 58 while(cin >> n >> max_dis) 59 { 60 init(n); 61 for(int i = 1; i <= n; i++) 62 { 63 cin >> num[i].x >> num[i].y; 64 } 65 char ch; 66 int p, q; 67 //getchar(); 68 while(cin >> ch) 69 { 70 if(ch == O) //這裏是大寫字母O,不是0 71 { 72 cin >> p; 73 num[p].flag = 1; 74 for(int i = 1; i <= n; i++) 75 { 76 if(num[i].flag == 1 && i != p) 77 unite(num[p], num[i]); 78 } 79 } 80 else if(ch == S) 81 { 82 cin >> p >> q; 83 if(find(num[p].id) == find(num[q].id)) 84 { 85 cout << "SUCCESS" << endl; 86 } 87 else 88 { 89 cout << "FAIL" << endl; //最近有點不在狀態啊,找了這麽久的錯誤,才發現是FAIL寫成了FALL…… 90 } 91 } 92 } 93 } 94 return 0; 95 }

poj2236(並查集)