解析:
并查集,求每个集合的最小费用。
每次合并集合的时候,根节点保存当前集合最小的费用。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int n,m,a[N],p[N],cnt[N];
int find(int x){
return x==p[x]?x:p[x]=find(p[x]);
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
p[i]=i;
}
while(m--){
int x,y;
scanf("%lld%lld",&x,&y);
x=find(x),y=find(y);
if(a[x]<=a[y]) p[y]=x;
else p[x]=y;
}
int ans=0;
for(int i=1;i<=n;i++){
if(i==p[i]) ans+=a[i];
}
printf("%lld",ans);
return 0;
}