#include <stdio.h>
#include <string.h>
#define MaxInt 0x3f3f3f3f
int Answer;
int map[102][102];
int visited[102],low[102];
int n;
int prim()
{
int i,j,pos,min,result=0;
memset(visited,0,sizeof(visited));
visited[1]=1;
pos=1;
//第一次给low数组赋值
for(i=1;i<=n;i++)
{
if(i!=pos)
low[i]=map[pos][i];
}
//再运行n-1次
for(i=1;i<n;i++)
{
//找出最小权值并记录位置
min=MaxInt;
for(j=1;j<=n;j++)
{
if(visited[j]==0 && min>low[j])
{
min=low[j];
pos=j;
}
}
result+=min;
visited[pos]=1;
for(j=1;j<=n;j++)
{
if(visited[j]==0&&low[j]>map[pos][j])
low[j]=map[pos][j];
}
}
return result;
}
int main(void)
{
int T, test_case;
int i,j;
setbuf(stdout, NULL);
scanf("%d", &T);
for(test_case = 0; test_case < T; test_case++)
{
Answer = 0;
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
scanf("%d", &map[i][j]);
}
}
Answer = prim();
printf("Case #%d\n", test_case+1);
printf("%d\n", Answer);
}
return 0;
}
prim
最新推荐文章于 2024-05-10 09:22:29 发布