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

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