1. 程式人生 > >計算機演算法設計與分析 (四) 貪心演算法--單源最短路徑

計算機演算法設計與分析 (四) 貪心演算法--單源最短路徑

1.Dijkstra演算法是解決單源最短路徑的一個貪心演算法。給定一個帶權有向圖G=(V,E),其中每條邊的權都是非負實數,另外,還給定V中的一個頂點,稱為源。現在要計算源到其他各個頂點的最短路長度。這裡的路的長度指的是路上各邊權之和。
Dijkstra演算法可描述如下,其中輸入的帶權有向圖是G=(V,E),頂點v是源。c是一個二維陣列,c[i][j]表示邊(i,j)的權。當(i,j)之間無直接的邊連線時,c[i][j]是一個大數。dist[i]表示當前從源點到頂點i的最短特殊路徑長度。

template<class Type>
void Dijkstra(int n, int v,Type dist[][],int prev[],Type **c)
{
	bool s[n+1];
	for(int i=1;i<=n;++i)
	{
		dist[i]=c[v][i];
		s[i]=false;
		if(dist[i]==Int_Max) prev[i]=0;
		else prev[i]=v;
	}
	dist[v]=0;
	s[v]=true;
	for(int i=1;i<n;++i)
	{
		int temp =maxint;
		int u=v;
		for(int i=1;i<n;i++)
		{
			if(dist[j]<temp&&!s[i])//選出當前剩餘點中距離v最近的點
			{
				u=j;
				temp=dist[j];
			}
		}
		s[u]=true
		for(int j=1;j<=n;++j)//更新dist陣列
		{
			if(!s[i]&&c[u][j]+dist[u]<dist[j])
			{	
				dist[j]=c[u][j]+dist[u];
				prev[j]=u;
			}
		}
	}
}

演算法的正確性和複雜性
1)貪心選擇性質
dijkstra演算法所做的貪心選擇是從V-S中選擇具有最短特殊路徑的頂點u,從而確定源到u的最短路徑長度
2)最優子結構
不論演算法中dist[u]是否變化,它總是關於當前頂點集S到v的特殊最短路徑長度