prim算法:所有点组成了一个集合 (笔者称之为全集),先从全集中选出一个点pos放入一个集合(笔者称之为 结果集 ),用一个数组记录pos到剩下点的距离(即 结果集到剩余点的距离),选出最短距离所对应的另一个点 D 加入到结果集中 ,将pos 更新为 D,此时遍历图,若D到剩余点的距离小于low数组中对应的值 ,则更新low数组,再重复选取结果集到剩余点的最短距离 更新low数组,poj 1258 点击打开链接
代码如下:
#include<stdio.h>
#include<string.h>
int map[120][120],visit[120],low[1100];
int n,ans;
void prim()
{
int pos,i,j;
pos=1;
visit[pos]=1;
for(i=1; i<=n; i++)//第一次对low数组赋值
if(i!=pos)
low[i]=map[pos][i];
for(i=1; i<n; i++)
{
int min=999999;
for(j=1; j<=n; j++)
if(visit[j]==0&&min>low[j])
{
min=low[j];
pos=j;
}
//printf("**%d\n",min);
ans+=min;
visit[pos]=1;
for(j=1; j<=n; j++)//更新low数组;
if(visit[j]==0&&map[pos][j]<low[j])
low[j]=map[pos][j];
}
}
int main()
{
int i,j,tem;
while(scanf("%d",&n)!=EOF)
{
memset(map,9999999,sizeof(map));
memset(visit,0,sizeof(visit));
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
scanf("%d",&tem);
map[i][j]=map[j][i]=tem;
}
ans=0;
prim();
printf("%d\n",ans);
}
return 0;
}