有个散布谣言的人,要把一个谣言传给所有人,有的人是朋友,只要告诉其中一人,他的朋友就会知道,求最小花费。例如样例一,先告诉1(然后1会告诉4,4再告诉5),这样就只用再告诉2和3就行了,所以最小花费是2+5+3=10。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1.5e6+5;
const int MAXM = 1.5e6+5;
typedef long long ll;
std::vector<int> v[MAXM];
int sum[MAXM];
int a[MAXN];
int r[MAXM];
int root(int x){
if(r[x] == x)
return x;
int y = root(r[x]);
r[x] = y;
return y;
}
void unions(int x, int y){
int rx = root(x);
int ry = root(y);
if(a[rx] < a[ry]){
r[ry] = rx;
}
else r[rx] = ry;
}
int main(){
int n , m;
cin >> n >> m;
for(int i = 1; i <= n ; i++){
cin >> a[i];
r[i] = i;
}
for(int i = 1; i <= m; i++){
int x , y;
cin >> x >> y;
unions(x,y);
}
ll ans = 0;
for(int i = 1; i <= n ; i ++){
if(r[i] == i){
ans += a[i];
}
}
cout << ans << endl;
return 0;
}