咋一看还以为是,求森林里树的最小和
实际增加0点就是求最小生成树了……

#include<stdio.h>
int map[309][309];
int dis[309];
int p[309];
bool use[309];
int n;
void krus()
{
int i,min,rj,j;
for(i=0;i<=n;i++)
{
use[i]=0;
dis[i]=map[0][i];
}
use[0]=1;
int add=0;
for(i=0;i<n;i++)
{
min=99999999;
for(j=0;j<=n;j++)
{
if(use[j]==1)continue;
if(dis[j]<min)
{
min=dis[j];
rj=j;
}
}
use[rj]=1;
add+=min;
for(j=0;j<=n;j++)
{
if(use[j]==1)continue;
if(dis[j]>map[rj][j])
dis[j]=map[rj][j];
}
}
printf("%d\n",add);
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&p[i]);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
}
}
for(i=1;i<=n;i++)
{
map[0][i]=p[i];
map[i][0]=p[i];
}
krus();
}
}