Dijkstra演算法與Prim演算法的區別
1.prim演算法過程:
prim演算法是最小生成樹演算法,它運用的是貪心原理,設定兩個點集合,一個集合為要求的生成樹的點集合A,另一個集合為未加入生成樹的點B。
它的具體實現過程是:
(1):所有的點都在集合B中,A集合為空。(memset(visited,0,sizeof(visited))
(2):任意以一個點為開始,把這個初始點加入集合A中,從集合B中減去這個點(visited[1]=1)。尋找與它相鄰的點中路徑最短的點,如後把這個點也加入集合A中,從集合B中減去這個點(visited[pos]=1)。
(3):更新未被訪問的節點的dist[]值。
(4):重複上述過程。一直到所有的點都在A集合中結束。
以下給出具體實現程式碼:
int Prim() { int i,j,pos,min,sum; for(i=1;i<=N;i++) dist[i]=map[1][i];//dist[]初始化為從起點到各點的距離。 visited[1]=1; for(i=1;i<N;i++)//總共N個節點,已經把第一個節點放進去了,剩下還得放N-1個節點 { min=INF; for(j=1;j<=N;j++) { if(!visited[j] && dist[j]<min)//找與剛加入的點距離最小的點 { min=dist[j]; pos=j; } } visited[pos]=1;//將pos點加入 for(j=1;j<=N;j++)//更新dist[] { if(!visited[j] && map[pos][j]<dist[j]) { dist[j]=map[pos][j]; } } } sum=0; for(i=1;i<=N;i++) { sum=sum+dist[i]; if(dist[i]==INF) return -1; } return sum; }
2.dijkstra演算法過程:
(1)初始時,S只包含源點v,即S=v。U包含除v外的其他頂點,U中頂點u距離為邊上的權(若v與u有邊)或(若u不是v的出邊鄰接點)。
(2)從U中選取一個距離v最小的頂點k,把k,加入S中(該選定的距離就是v到k的最短路徑長度)。
(3)以k為新考慮的中間點,修改U中各頂點的距離;若從源點v到頂點u(u U)的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改後的距離值的頂點k的距離加上邊上的權。
(4)重複步驟(2)和(3)直到所有頂點都包含在S中。
以下給出具體實現程式碼:
void Dijkstra() { int i,j,min,pos,max; memset(visited,0,sizeof(visited)); for(i=1;i<=N;i++) dist[i]=map[1][i];//初始化所有節點的dist[]陣列為其到源點的距離 visited[1]=1; for(i=1;i<=N;i++) { min=INF; for(j=1;j<=N;j++) { if(!visited[j] && dist[j]<min)//找到一個距離源點最近的節點 { pos=j; min=dist[j]; } } if(min==INF) break;//如果min=INF表示源點到所有其他節點都不可達 visited[pos]=1;//標記pos節點為已訪問的節點 for(j=1;j<=N;j++) { //如果i節點經由pos節點到達j節點的距離小於i節點直接到j節點的距離(即i->pos->j的距離小於i->j的距離),則更新j節點的dist[j]值 if(!visited[j] && dist[pos]+map[pos][j]<dist[j]) dist[j]=dist[pos]+map[pos][j]; } } }
3.小總結
1:Prim是計算最小生成樹的演算法,比如為N個村莊修路,怎麼修花銷最少。
Dijkstra是計算最短路徑的演算法,比如從a村莊走到其他任意村莊的距離。
2:Prim演算法中有一個統計總len的變數,每次都要把到下一點的距離加到len中;
Dijkstra演算法中卻沒有,只需要把到下一點的距離加到dist[]陣列中即可;
3:Prim演算法的更新操作更新的dist[]是已訪問集合到未訪問集合中各點的距離;
Dijkstra演算法的更新操作更新的dist[]是源點到未訪問集合中各點的距離;
4.具體例題