#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即可。