题目大意:n块农田灌水,可以修水库或者从其他农田引水,求最少代价。
题解:建个源点连边搞搞就行。很久以前的代码,码风诡异……
我的收获:……
#include <cstdio>
#include <iostream>
#include <algorithm>
#define M 305
using namespace std;
int n,m,tot,x,y,z,ans,w;
int v[M*M],u[M*M],val[M*M];
int f[M],r[M*M];
void init()
{
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&w);
u[++m]=n+1;v[m]=i;val[m]=w;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&z);
if(i!=j){
u[++m]=i;v[m]=j;val[m]=z;
}
}
}
int cmp(const int a,const int b){
return val[a]<val[b];
}
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
void work()
{
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++) r[i]=i;
sort(r+1,r+1+m,cmp);
for(int i=1;tot<=n-1;i++)
{
int e=r[i];
x=find(u[e]),y=find(v[e]);
if(x!=y){
f[x]=y;tot++;
ans+=val[e];
}
}
printf("%d\n",ans);
}
int main()
{
init();
work();
return 0;
}