最小生成树变型——[Usaco2008 Oct]灌水

咋一看还以为是,求森林里树的最小和
实际增加0点就是求最小生成树了……
View Code
#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();
}
}
原文地址:https://www.cnblogs.com/huhuuu/p/1994296.html