最小生成树
用的prim算法
AC代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10000000
int edge[1005][1005];
int adapter[1005],lowcost[1005];
int n;
void init()
{
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&adapter[i]);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&edge[i][j]);
if(i==j) edge[i][j]=MAX;
else
edge[i][j]+=adapter[i]+adapter[j];
}
}
memset(lowcost,0,sizeof(lowcost));
}
void prim()
{
int i,j,k,min,sum=0;
for(i=0;i<n;i++)
lowcost[i]=edge[0][i];
lowcost[0]=-1;
for(i=1;i<n;i++)
{
min=MAX;
for(j=0;j<n;j++)
{
if(lowcost[j]>=0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
}
sum+=min;
lowcost[k]=-1;
for(j=0;j<n;j++)
if(edge[k][j]<lowcost[j])
lowcost[j]=edge[k][j];
}
printf("%d\n",sum);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
prim();
}
return 0;
}