并查集 合并的同时,确定这个集合的最小花费
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + 7, maxd = 670000 + 7;
const ll mod = 1e9 + 7;
const int INF = 0x7f7f7f7f;
int n, m;
ll a[maxn], ans = 0;
bool vis[maxn];
int f[maxn];
int find_(int i) {
return f[i] == i ? f[i] : (f[i] = find_(f[i]));
}
void union_(int x, int y) {
int fx = find_(x), fy = find_(y);
a[fy] = min(a[fx],a[fy] );
f[fx] = f[fy];
}
int main() {
ios::sync_with_stdio(0);
cin >> n >> m;
for(int i = 1; i <= n; ++i) {
cin >> a[i];
f[i] = i;
}
int x, y;
for(int i = 0; i < m; ++i) {
cin >> x >> y;
union_(x, y);
}
ans = 0;
for(int i = 1; i <= n; ++i) {
if(f[i] != i) continue;
ans += a[i];
}
cout << ans << endl;
return 0;
}