此題就是prim演算法模板
直接給程式碼、
#include "iostream"
using namespace std;
#define MAXSIZE 102
int map[MAXSIZE][MAXSIZE];
int vis[MAXSIZE];
int temp[MAXSIZE];
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
int ans=0;
int i,j;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
scanf("%d",&map[i][j]);
}
}
memset(vis,0,sizeof(vis));
for (j=0;j<n;j++)
{
temp[j]=9000010;
}
i=0;
for (j=0;j<n;j++)
{
if (map[i][j]!=0)
if (map[i][j]<temp[j])
{
temp[j]=map[i][j];
}
}
vis[0]=1;
while (i<n-1)
{
//找最小的邊
int min=9000010;
int minindex=0;
for (j=0;j<n;j++)
{
if (vis[j]==1)
{
continue;
}
if (min>temp[j])
{
min=temp[j];
minindex=j;
}
}
//把最小的邊的頂點加入集合
vis[minindex]=1;
//更新temp
for (j=0;j<n;j++)
{
if (map[minindex][j]!=0&&vis[j]!=1)
if (map[minindex][j]<temp[j])
{
temp[j]=map[minindex][j];
}
}
ans+=min;
i++;
}
printf("%d\n",ans);
}
return 0;
}
/*
6
0 6 1 5 0 0
6 0 5 0 3 0
1 5 0 5 6 4
5 0 5 0 0 2
0 3 6 0 0 6
0 0 4 2 6 0
*/