安科 OJ 1190 鏈接電腦 (並查集)


機房裏有若干臺電腦,其中有一些電腦已經相互鏈接。若是A和B經過網線相連,而且B與C也經過網線相連,那麼即使A和C之間沒有直接的網線相連,也能夠認爲A和C是相連的。因爲機房裏的佈線比較亂,並非全部電腦都相互連通,請問在不變更當前佈線狀況下,最少要購買幾條網線才能使得機房全部電腦都兩兩連通。 
多組數據。每組數據第一行爲整數N,M。N是電腦數量,M是機房已佈置好的網線數量。接下來M行,每行爲整數A,B。代表A,B之間經過一條網線直接相連。這裏能夠認爲網線是不分方向的,即A->B等價於B->A。 
(0 < N <= 200,0 <= M <= 10000,0 < A,B <= N 。) N=0和M=0爲輸入結束,不須要處理。 
每組一個整數,即最少還要購買幾根網線。
4 2
1 2
2 3
4 0
1 0
0 0
1
3
0

 

思路:用並查集存儲,如果連在一塊兒的電腦就存到一個集合裏面,最後判斷下有幾個集合,答案就是集合個數減一。在鏈接集合的時候設左邊爲父結點。spa

代碼:debug

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 int fina(int num);
 7 int n, m, a[2010];
 8 
 9 int main()
10 {
11     cin >> n >> m;
12         
13     while (n || m)
14     {
15         for (int i = 1; i <= n; i ++ )
16             a[i] = i;
17         int x, y;
18         while (m -- )
19         {
20             cin >> x >> y;
21             if (fina(x) != fina(y))
22             {
23                 a[fina(y)] = fina(x);
24             }
25         }
26         int ans = 0;
27         for (int i = 1; i <= n; i ++ )
28             if (a[i] == i)   ans ++ ;
29             
30         cout << ans - 1 << endl;
31         cin >> n >> m;
33         memset(a,0,sizeof(a));
34     }
35     return 0;
36 }
37 
38 int fina(int num)
39 {
40     if (num == a[num])  return num;
41     else
42     {
43         a[num] = fina(a[num]);
44         return a[num];
45     }
46 }

PS:應該是安科 OJ 數據的問題,題目說的 n <= 200,可是數組開到210就會越界,開到2010才行(當時debug了很久,555~)code

相關文章
相關標籤/搜索