Successfully reported this slideshow.
Upcoming SlideShare
×

# [ACM-ICPC] Disjoint Set

652 views

Published on

Published in: Education
• Full Name
Comment goes here.

Are you sure you want to Yes No
• Be the first to comment

### [ACM-ICPC] Disjoint Set

1. 1. Disjoint Set 郭至軒（KuoE0） KuoE0.tw@gmail.com KuoE0.ch
2. 2. Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) http://creativecommons.org/licenses/by-sa/3.0/ Latest update: Mar 13, 2013
3. 3. Disjoint Set 中國譯：並查集 1 4 75 8 2 3 6 9
4. 4. Disjoint Set 中國譯：並查集 1 4 75 8 2 3 6 9
5. 5. Disjoint Set 中國譯：並查集 1 4 75 8 2 3 6 9
6. 6. Disjoint Set 中國譯：並查集 1 4 75 8 2 3 6 9
7. 7. Tree Structure 1 4 75 8 2 3 6 9 1
8. 8. Tree Structure 1 4 7 25 6 3 9 8
9. 9. Data Structure index 0 1 2 3 4content parent node parent node parent node parent node parent node The parent of root is itself!
10. 10. Find Operation node parent 1 1 1 2 2 15 6 5 2 6 2
11. 11. How to determine that node 2 and node 6 in the same set? 1 2 5 6
12. 12. How to determine that node 2 and node 6 in the same set? 1 2 2 6 5 6
13. 13. How to determine that node 2 and node 6 in the same set? 1 2 1 2 6 2 5 6
14. 14. How to determine that node 2 and node 6 in the same set? 1 2 1 2 6 2 1 5 6
15. 15. Source Code// parent is an array stored the parentof nodes.int findSet( int x ) { if ( parent[ x ] == x ) return x; return findSet( parent[ x ] );}
16. 16. If the height of tree is very large... ... } ... ... ... n ... ...
17. 17. Reduce Height 1 25 6
18. 18. Reduce Height 1 1 2 5 65 6 2
19. 19. Reduce Height node parent 1 1 1 2 15 6 2 5 1 6 1
20. 20. Source Code// parent is an array stored the parent ofnodes.int findSet( int x ) { if ( parent[ x ] == x ) return x; return parent[ x ] = findSet( parent[ x ] );}
21. 21. Union Operation 1 7 25 6 9 8 Height = 3 Height = 2
22. 22. Union Operation 1 7 25 6 9 8 Height = 3 Height = 2
23. 23. Union Operation 1 2 7 5 6 9 8 Height = 3
24. 24. Source Code// parent is an array stored the parent ofnodes.// height is an array stored the height of treevoid unionSet( int a, int b ) { if ( a == b ) return; if ( height[ a ] > height[ b ] ) parent[ b ] = a; else { parent[ a ] = b; if ( height[ a ] == height[ b ] ) ++height[ b ]; }}
25. 25. Time ComplexityFind Operation O(1)Union Operation O(1)
26. 26. Practice Now[UVa] 10583 - Ubiquitous Religions
27. 27. 10583 - Ubiquitous Religions 佛教 佛教 基督教 佛教 基督教 佛教 基督教 佛教 回教
28. 28. 10583 - Ubiquitous Religions 佛教 佛教 基督教 佛教 基督教 佛教 基督教 佛教 回教
29. 29. 10583 - Ubiquitous Religions 佛教 佛教 基督教 佛教 基督教 佛教 基督教 佛教 回教
30. 30. 10583 - Ubiquitous Religions 佛教 佛教 基督教 佛教 基督教 佛教 基督教 佛教 回教
31. 31. 10583 - Ubiquitous Religions 佛教 佛教 基督教 佛教 基督教 佛教 基督教 佛教 回教
32. 32. 10583 - Ubiquitous Religions 佛教 佛教 基督教 佛教 基督教 佛教 基督教 佛教 回教
33. 33. 10583 - Ubiquitous Religions 佛教 佛教 基督教 佛教 基督教 佛教 基督教 佛教 回教
34. 34. 10583 - Ubiquitous Religions 佛教 回教佛教 佛教 佛教 佛教 基督教 基督教 基督教
35. 35. Source Code#include <iostream>#include <cstdio>using namespace std;#define MAXN 50010int parent[ MAXN ], height[ MAXN ];int main() { int n, t = 0, e, a, b; while ( scanf( “%d %d”, &n, &e ) && n && e ) { for ( int i = 1; i <= n; ++i ) parent[ i ] = i; height[ i ] = 1; for ( int i = 0; i < e; ++i ) { scanf( “%d %d”, &a, &b ); unionSet( findSet( a ), findSet( b ) ); } int ret = 0; for ( int i = 1; i <= n; ++i ) if ( parent[ i ] == i ) ++ret; printf( “Case %d: %dn”, ++t, ret ); } return 0;}
36. 36. Practice Now [UVa] 10608 - Friends
37. 37. Thank You for Your Listening.