Title
https://www.luogu.com.cn/problem/P1550
Solution
建立一个超级源点,连接所有点,权值为修建水库的费用。
Code
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
struct node{
int x,y,z;
}a[100001];
int n,t[1010],tot,f[1010]; long long ans;
bool b[1001];
queue<int> q;
void add(int x,int y,int z){
a[++tot]=(node){x,y,z};
}
inline bool cmp(node x,node y){
return x.z<y.z;
}
inline int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
int main(){
scanf("%d",&n);
f[0]=0;
for(int i=1;i<=n;i++) scanf("%d",&t[i]),f[i]=i,add(0,i,t[i]);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) {
int z;
scanf("%d",&z);
if (i!=j) add(i,j,z);
}
sort(a+1,a+tot+1,cmp);
int q=0;
for(int i=1;i<=tot;i++){
int x=find(a[i].x),y=find(a[i].y);
if (f[x]!=f[y]){
f[x]=y,q++; ans+=a[i].z;
}
if (q==n) break;
}
printf("%lld",ans);
}