这是O(v^2)的实现,以后就拿这个当模板了。
#include <iostream>
using namespace std;
int map[100][100];//存储边权值
bool inTree[100];
int min_length[100];//非Tree结点和Tree中的结点间的min_distance
int prim(int n)
{
int sum_length=0;
memset(inTree,0,sizeof(inTree));
for(int i=0;i<n;i++)//一开始,所有节点都是非Tree结点
{
min_length[i]=INT_MAX;
}
min_length[0]=0;//结点0作为起始结点
for(int i=0;i<n;i++)
{
int min_index=-1;
for(int j=0;j<n;j++)
{
if(!inTree[j]&&(min_index==-1||min_length[j]<min_length[min_index]))
min_index=j;
}
inTree[min_index]=true;//将新寻找到的结点加到tree中,标记
sum_length+=min_length[min_index];
for(int j=0;j<n;j++)//将所有和min_index相连的非tree结点的min_distance更新
{
if(!inTree[j]&&map[min_index][j]<min_length[j])
min_length[j]=map[min_index][j];
}
}
return sum_length;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&map[i][j]);
}
}
printf("%d/n",prim(n));
}
return 0;
}