这题比较水。
首先考察点就是最小生成树,对吧?
然后水管相当于一条边
然后每个点可以建立井,那么就新加一个大源点,所有点往大源点连一条边即可
边权就是W[i]
#include<bits/stdc++.h>
using namespace std;
#define s 406
#define ll long long
struct node{
int x,y,w;
bool operator <(const node&u)const{
return w>u.w;
}
};
int fa[500];
int Get(int x){
if(fa[x]==x)return x;
return fa[x]=Get(fa[x]);
}
int main(){
priority_queue<node>q;
int n;
cin>>n;
fa[s]=s;
for(int i=1;i<=n;i++){
int x;
cin>>x;
fa[i]=i;
q.push({s,i,x});
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int x;
cin>>x;
q.push({i,j,x});
}
}
ll res=0;
while(q.empty()==false){
int x=q.top().x,y=q.top().y,w=q.top().w;
q.pop();
int rx=Get(x),ry=Get(y);
if(rx==ry)continue;
fa[rx]=ry;
res+=w;
}
cout<<res;
return 0;
}