Prim演算法和Dijkstra演算法的異同
阿新 • • 發佈:2019-02-10
之前一直覺得Prim和Dijkstra很相似,但是沒有仔細對比;
今天看了下,主要有以下幾點:
1:
Prim是計算最小生成樹的演算法,比如為N個村莊修路,怎麼修花銷最少。
Dijkstra是計算最短路徑的演算法,比如從a村莊走到其他任意村莊的距離。
2:
Prim演算法中有一個統計總len的變數,每次都要把到下一點的距離加到len中;
Dijkstra演算法中卻沒有,只需要把到下一點的距離加到cls陣列中即可;
3:
Prim演算法的更新操作更新的cls是已訪問集合到未訪問集合中各點的距離;
23 for (j=0;j<n;j++)
24 {
26 {
27 adjset[j] = map[j][nid];
28 }
29 }
Dijkstra演算法的更新操作更新的cls是源點到未訪問集合中各點的距離,已經訪問過的相當於已經找到源點到它的最短距離了;
20 for (j=1;j<=n;j++)
22
if(!vis[j]&&map[nxt][j]<MAX&&(min+map[nxt][j])<cls[j])//更新條件:j點未訪問,新點與j點之間有路,
23 cls[j]=cls[nxt]+map[nxt][j];
24 }
Prim演算法
//初始化 memset(visited,0,sizeof(visited)); visited[0] = 1; len = 0; for (i=0;i<n;i++) adjset[i] = map[i][0]; //Begin for (i=1;i<n;i++) { //找到下一條符合條件的點 nlen = MAX; for (j=0;j<n;j++) { if (!visited[j] && adjset[j]<nlen) { nlen = adjset[j]; nid = j; } } //訪問找到的那個點 len += nlen; visited[nid] = 1; //更新鄰接距離 for (j=0;j<n;j++) { if (!visited[j] && map[j][nid]<adjset[j]) { adjset[j] = map[j][nid]; } }
Dijkstra演算法
void Dijkstra(int v)
{
int i,j,min,nxt;
for(i=1;i<=n;i++) cls[i]=map[v][i];
memset(vis,0,sizeof(vis));
vis[v]=1;
for (i=1;i<n;i++)
{
min=MAX;
nxt=v;
for (j=1;j<=n;j++)
{
if(!vis[j]&&cls[j]<min)
{
nxt=j;
min=cls[j];
}
}
vis[nxt]=1;
for (j=1;j<=n;j++)
{
if(!vis[j]&&map[nxt][j]<MAX&&(min+map[nxt][j])<cls[j])
cls[j]=cls[nxt]+map[nxt][j];
}
}
}