CodeForces - 893C Rumor【并查集】
题目大意:
有n个人,其中有m对朋友,现在你有一个秘密你想告诉所有人,第i个人愿意出价a[i]买你的秘密,获得秘密的人会免费告诉它的所有朋友(他朋友的朋友也会免费知道),现在他们想出最少的价钱买秘密,那么你最少能得到多少钱?
解题分析:
题意很明显,就是求出每个块最低的价格,然后将这些价格相加就行,处理的时候,我们对并查集根的值进行更新,记录该根所对应块中的最低价格。
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 #define N int(1e5+10) 8 typedef long long ll; 9 int n,m; 10 ll val[N],fa[N]; 11 int find(int x){ 12 if(fa[x]==x)return x; 13 return fa[x]=find(fa[x]); 14 } 15 void Merge(int a,int b){ 16 int f1=find(a); 17 int f2=find(b); 18 if(f1!=f2){ 19 fa[f2]=f1; 20 } 21 } 22 int main(){ 23 cin>>n>>m; 24 for(int i=1;i<=n;i++) 25 cin>>val[i]; 26 for(int i=1;i<=n;i++)fa[i]=i; 27 for(int i=1;i<=m;i++){ 28 int u,v;cin>>u>>v; 29 Merge(u,v); 30 } 31 for(int i=1;i<=n;i++){ 32 int rt=find(i); 33 if(val[i]<val[rt])val[rt]=val[i]; 34 } 35 ll sum=0; 36 for(int i=1;i<=n;i++){ 37 if(fa[i]==i)sum+=val[i]; 38 } 39 cout<<sum<<endl; 40 }
2018-04-02
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。