题目大意:
有n口水井,可以建立管道从别的草地引水进来,挖一口井需要 w i w_i wi元,求最少需要花费多少才能保证每个草地都有水。
思路:
把井看做一个个节点,然后新建一个节点0,然后用最小生成树中的 prim或者Kruskal把这个点与其他节点进行prim或者Kruskal。
C o d e Code Code:
#include<cstdio>
#include<cstring>
#include<iostream>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
using namespace std;
int a[1000],f[1000][1000],maxx[1000];
int n,sum;
bool check[401];
int main()
{
fre(water); //文件输入输出
memset(maxx,0x7f,sizeof(maxx)); //初始化
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
maxx[i]=a[i];//让他与每个编号对应
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&f[i][j]);
for(int i=1;i<=n;i++)//prim
{
int gg=0;
for(int j=1;j<=n;j++)
if(!check[j]&&(maxx[j]<maxx[gg]))
gg=j;
check[gg]=1;
for(int j=1;j<=n;j++)
if(!check[j]&&f[gg][j]<maxx[j])
maxx[j]=f[gg][j]; //替换
}
for(int i=1;i<=n;i++)
if(check[i])
sum+=maxx[i];//累加答案
printf("%d",sum);
return 0;
}