-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathCOPA14.cpp
73 lines (62 loc) · 1.25 KB
/
COPA14.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <bits/stdc++.h>
using namespace std;
//Graphs - Minimum Spanning Tree - Kruskal Algorithm + DSU(Union-Find)
//Ubiratan Correia Barbosa Neto
int uf[10000+1];
int sz[10000+1];
void init(int n){
for(int i=0; i<=n; i++){
sz[i] = 1;
uf[i] = i;
}
}
int find(int a){
if(uf[a] == a) return a;
else {
uf[a] = find(uf[a]); //after find the leader l, set uf[i] = l, for all i in the set
return uf[a];
}
}
void merge(int x, int y){
int a = find(x);
int b = find(y);
if(sz[a] < sz[b]) swap(a,b); // we want a > b
uf[b] = a;
sz[a] += sz[b];
}
struct edges{
int u,v,cost;
edges(){}
edges(int u, int v, int cost) : u(u), v(v), cost(cost){}
};
bool cmp(const edges & a, const edges & b){
return (a.cost < b.cost);
}
int kruskal(vector<edges> & e){
int ans = 0;
sort(e.begin(), e.end(), cmp);
for(int i = 0; i < e.size(); ++i){
if(find(e[i].u) == find(e[i].v)) continue;
merge(e[i].u, e[i].v);
ans += e[i].cost;
}
return ans;
}
int main() {
int n,m,k;
cin >> n >> m >> k;
init(n);
vector<edges> e1,e2;
for(int i=0; i<m; i++){
int u,v,c;
cin >> u >> v >> c;
e1.push_back(edges(u,v,c));
}
for(int i=0; i<k; i++){
int u,v,c;
cin >> u >> v >> c;
e2.push_back(edges(u,v,c));
}
cout << kruskal(e1) + kruskal(e2) << endl;
return 0;
}