File tree 1 file changed +61
-0
lines changed
1 file changed +61
-0
lines changed Original file line number Diff line number Diff line change
1
+ struct dsu {
2
+ vector<int > parent;
3
+ vector<int > _size;
4
+
5
+ // merge two sets having a&b as entities
6
+ void union_sets (int a, int b) {
7
+ a = find_set (a);
8
+ b = find_set (b);
9
+ if (a != b) {
10
+ if (_size[a] < _size[b])
11
+ swap (a, b);
12
+ parent[b] = a;
13
+ _size[a] += _size[b];
14
+ }
15
+ }
16
+
17
+ // find the set leader
18
+ int find_set (int v) {
19
+ if (v == parent[v])
20
+ return v;
21
+ return parent[v] = find_set (parent[v]);
22
+ }
23
+
24
+ // check if same set/leader
25
+ bool same_comp (int a, int b) {
26
+ return find_set (a) == find_set (b);
27
+ }
28
+
29
+ void make_set (int v) {
30
+ parent[v] = v;
31
+ _size[v] = 1 ;
32
+ }
33
+
34
+ void _init (int n) {
35
+ parent.assign (n, 0 );
36
+ _size.assign (n, 0 );
37
+
38
+ for (int i = 0 ; i < n; i++)
39
+ make_set (i);
40
+ }
41
+ };
42
+
43
+ class Solution {
44
+ public:
45
+ int minSwapsCouples (vector<int >& row) {
46
+ int n = row.size ();
47
+ n /= 2 ;
48
+
49
+ dsu D;
50
+ D._init (n + 1 );
51
+ int ccs = n;
52
+ for (int i = 0 ; i < 2 * n; i += 2 ){
53
+ if (D.find_set (row[i]/2 ) != D.find_set (row[i+1 ]/2 )){
54
+ D.union_sets (row[i]/2 , row[i+1 ]/2 );
55
+ ccs--;
56
+ }
57
+ }
58
+
59
+ return (n - ccs);
60
+ }
61
+ };
You can’t perform that action at this time.
0 commit comments