题目描述
https://ac.nowcoder.com/acm/contest/35886/H
题意
思路
并查集将认识的同学分为若干组,每组选出代价最小者结交
code
#include<bits/stdc++.h>
#define DEBUG(x) #x<<":"<<(x)<<' '
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
const int INF=0x3f3f3f3f;
// const int mod=1e9+7;
const int N=1e5+10;
int a[N];
int fa[N];
int find(int x)
{
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}
void setunion(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)fa[x]=y;
}
void solv()
{
int n,m,u,v;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
fa[i]=i;
}
while(m--)
{
cin>>u>>v;
setunion(u,v);
}
map<int,int> mp;
int t;
for(int i=1;i<=n;i++)
{
t=find(i);
if(mp.count(t)==0)mp[t]=a[i];
else mp[t]=min(a[i],mp[t]);
}
ll ans=0;
for(auto it:mp)
{
ans+=it.second;
}
cout<<ans<<'\n';
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--)
{
solv();
}
return 0;
}