#include<iostream>
#include<string.h>
using namespace std;
typedef long long int ll;
const int maxn = 1e5+5;
int f[maxn],cost[maxn];
void Init(int n){
for(int i=1;i<=n;i++){
f[i] = i;
}
}
int Find(int x){
return f[x]==x?x:f[x]=Find(f[x]);
}
void Unit(int x,int y){
int fx = Find(x);
int fy = Find(y);
if(fx!=fy){
f[fy] = fx;
}
}
int main(){
int n,m;
cin>>n>>m;
Init(n);
for(int i=1;i<=n;i++){
cin>>cost[i];
}
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
Unit(a,b);
}
bool vis[n+5];
memset(vis,false,sizeof(vis));
int c[n+5];
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++){
int fi = Find(i);
if(!vis[fi]){
vis[fi] = true;
c[fi] = min(cost[fi],cost[i]);
//c[fi] = cost[fi] 原来此处wa点在于 fi>i时cost[fi] 与cost[i]之间无比较
}
else c[fi] = min(c[fi],cost[i]);
}
ll ans = 0;
for(int i=1;i<=n;i++) ans+=c[i];
cout<<ans<<endl;
}
CF893 C. Rumor
最新推荐文章于 2023-06-18 07:01:56 发布