解析:
并查集,求每个集合的最小费用。
每次合并集合的时候,根节点保存当前集合最小的费用。
#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;
}