白話Prim

需要有一個保存節點到當前集合的最短距離的數組,不連通的爲max

在搜索的循環內

1.循環所有點,找出與當前集合距離最短的點,設置當前點爲該點,設置該點訪問過

2.循環所有點,將未訪問過的點與當前最短距離和新點的最短距離比較,更新數組


代碼:

int prim(int n)
{
	initialize(visit,false,n);
	int low[POINTNUM];//當前集合到各個頂點的距離的最短值
	int newpoint;//當前需要搜索的點,即集合新增的點 
	int sum=0;//最終結果
	int min;//臨時最小值 
 
	newpoint=0;//當前點初始化爲編號0 
	visit[0]=1;//0點已加入集合 
 
	for(int i=0;i<n;i++) 
	low[i]=map[newpoint][i];//將當前集合(0點)到其他所有點的權值賦值到low裏面
 
	for(int i=1;i<n;i++)//開始搜索,總共需要搜索n-1次 
	{
		min=INT_MAX;
		for(int j=0;j<n;j++)//搜索與當前集合距離最短的點 
		{
			if(visit[j]==0 && min>low[j])//被搜索到的點還沒在集合裏,該點到當前集合的距離是存在的且足夠短 
			{
				min=low[j];
				newpoint=j; 
			}
		}
		sum+=min;
		visit[newpoint]=1;
		for(int j=0;j<n;j++)//爲集合新增的點添加滿足條件的權值 
		if(visit[j]==0)
		{
			if(low[j]>map[newpoint][j]) low[j]=map[newpoint][j];
		}
	} 
	return sum;
}


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