给大家推荐个靠谱的公众号程序员探索之路,大家一起加油
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1239
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INF 1000000
#define MAXN 305
int n,m;
int Edge[MAXN][MAXN];
int lowcost[MAXN];
int nearvex[MAXN];
int sumweight;
int num[305];
void prim(int u0)
{
sumweight=0;
int i,j;
memset(nearvex,0,sizeof(nearvex));
for(i=1;i<=n;i++)
{
lowcost[i]=Edge[u0][i];
}
//memset(lowcost,0x3f,sizeof(lowcost));
nearvex[u0]=1;
for(i=1;i<n;i++)
{
int min=INF;
int v=-1;
for(j=1;j<=n;j++)
{
if(!nearvex[j]&&lowcost[j]<min)
{
v=j;
min=lowcost[j];
}
}
nearvex[v]=1;
//printf("%d->%d lowcost[v]%d num[v]%d\n",nearvex[v],v,lowcost[v],num[v]);
//printf("%d %d %d\n",nearvex[v],v,lowcost[v]);
//nearvex[v]=-1;
if(min>num[v]) sumweight+=num[v];
else sumweight+=min;
for(j=1;j<=n;j++)
{
if(!nearvex[j]&&Edge[v][j]<lowcost[j])
{
lowcost[j]=Edge[v][j];
//nearvex[j]=v;
}
}
}
}
int main()
{
int i,j;
int u,v,w;
int k,f,mi=INF;
scanf("%d",&k);
while(k--)
{
mi=INF;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
if(mi>num[i])
{
mi=num[i];
f=i;
}
}
//printf("%d %d\n",mi,f);
memset(Edge,0,sizeof(Edge));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&Edge[i][j]);
}
}
prim(f);
printf("%d\n",sumweight+num[f]);
}
return 0;
}
/*
10
5
5 4 4 3 6
0 2 2 2 2
2 0 3 3 3
2 3 0 4 5
2 3 4 0 1
2 3 5 1 0
5
5 4 4 7 6
0 2 2 2 2
2 0 3 3 3
2 3 0 4 5
2 3 4 0 1
2 3 5 1 0
5
5 4 5 7 6
0 2 6 2 2
2 0 3 3 3
2 3 0 4 5
2 3 4 0 1
2 3 5 1 0
*/