#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100000
int map[100][100];
void init(int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
map[i][j]=MAX;
}
}
int Prim(int n)
{
int i,j;
int minc,mht;
int sum=0;
int visit[100],lowcost[100];
memset(visit,0,sizeof(visit));
for(i=0;i<n;i++)
lowcost[i]=map[0][i];
visit[0]=1;
for(i=1;i<n;i++)
{
mht=-1;
minc=MAX;
for(j=0;j<n;j++)
{
if(visit[j]==0 && minc>lowcost[j])
{
minc=lowcost[j];
mht=j;
}
}
if(mht==-1)
return -1;
sum+=minc;
visit[mht]=1;
for(j=0;j<n;j++)
{
if(visit[j]==0 && lowcost[j]>map[mht][j])
lowcost[j]=map[mht][j];
}
}
return sum;
}
int main()
{
int n;
while(scanf("%d",&n) && n!=0)
{
init(n);
int m=(n*(n-1))/2;
int i;
for(i=0;i<m;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
a--,b--;
map[a][b]=c;
map[b][a]=c;
}
int sum=Prim(n);
printf("%d\n",sum);
}
return 0;
}
该算法的精华在:
1.初始化(MAX!!!)这牵扯到后面的比较,十分重要。
2.两个数组vistied[max],和lowcast[max].
3.每找到一条边后进行的更新操作.
理解该算法的重点在,理解lowcast里存的到底是什么。
简单来说,lowcast[i],就是i可达的顶点中,到i的最小距离,它在prim算法执行过程中被不断更新(或不更新,因为没有更小的路径)。
如果要标记出一条最小路径,那么记忆一下mht即可。