【prim】算法

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章