1. 程式人生 > 實用技巧 >(簡單並查集)How many tables?

(簡單並查集)How many tables?

很簡單的並查集裸題了,基本沒啥需要額外維護的資訊,題目分兩步解決,

第一步:先將有關係的元素放到一個集合裡面。

第二步:將所有有公共關係的元素都在一個bool數組裡標記為true,之後遍歷

的時候將false的元素,也就是沒有公共關係的元素挨個累加(一個元素在一個桌子),

然後對於那些為true的元素,因為他們都是在一個桌子裡的,因此只要判斷他們的

父節點是不是自己,如果是就加一。

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 const int N = 1010;
 5
bool vis[N]; 6 int fa[N]; 7 int find(int x){ 8 if(x != fa[x]) fa[x] = find(fa[x]); 9 return fa[x]; 10 } 11 int main(){ 12 int t; 13 cin >> t; 14 while(t --){ 15 int n, m, ans = 0; 16 cin >> n >> m; 17 for(int i = 1; i <= n; i ++) fa[i] = i;
18 for(int i = 1; i <= m; i ++){ 19 int a, b; 20 cin >> a >> b; 21 if(find(a) != find(b)){ 22 fa[find(a)] = find(b); 23 vis[find(a)] = true; 24 vis[a] = true; 25 } 26 } 27 for
(int i = 1; i <= n; i ++){ 28 if(!vis[i]) 29 ans ++; 30 else 31 if(i == fa[i]) 32 ans ++; 33 } 34 cout << ans << endl; 35 } 36 37 return 0; 38 }