思路:
昨天刚讲超级终点,所以这道题贼水
设一个超级点,然后把所有水站的费用连向它,然后构造这个最小生成树就行了
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
int n;
int a[500][500];
int dis[500];
bool v[500];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
int x;
scanf("%d", &x);
a[n+1][i]=x;
a[i][n+1]=x;
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
scanf("%d", &a[i][j]);
}
v[1]=1;
for(int i=1; i<=n+1; i++)
dis[i]=a[1][i];
int ans=0;
for(int i=1; i<=n; i++)
{
int p=0;
int minn=1e9;
for(int i=1; i<=n+1; i++)
{
if(!v[i]&&dis[i]<minn)
minn=dis[i], p=i;
}
v[p]=1;
ans+=minn;
for(int i=1; i<=n+1; i++)
if(dis[i]>a[p][i])
dis[i]=a[p][i];
}
printf("%d", ans);
return 0;
}