Prim算法和Dijkstra算法的異同


 

之前一直覺得Prim和Dijkstra很相似,但是沒有仔細對比;

今天看了下,主要有以下幾點:

1:

Prim是計算最小生成樹的算法,比如為N個村庄修路,怎么修花銷最少。

Dijkstra是計算最短路徑的算法,比如從a村庄走到其他任意村庄的距離。

2:

Prim算法中有一個統計總len的變量,每次都要把到下一點的距離加到len中;

Dijkstra算法中卻沒有,只需要把到下一點的距離加到cls數組中即可;

3:

Prim算法的更新操作更新的cls是已訪問集合到未訪問集合中各點的距離;

23              for (j=0;j<n;j++)
24              {
25                  if (!visited[j] && map[j][nid]<adjset[j])//更新條件:j點未訪問,加入新點后已訪問集合到j的距離變小了
26                  {
27                      adjset[j] = map[j][nid];
28                  }
29              }

Dijkstra算法的更新操作更新的cls是源點到未訪問集合中各點的距離,已經訪問過的相當於已經找到源點到它的最短距離了;

20         for (j=1;j<=n;j++)
21        {

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算法

 1          //初始化
 2          memset(visited,0,sizeof(visited));
 3          visited[0] = 1;
 4          len = 0;
 5          for (i=0;i<n;i++)    adjset[i] = map[i][0];
 6          //Begin
 7          for (i=1;i<n;i++)
 8          {
 9              //找到下一條符合條件的點
10              nlen = MAX;
11              for (j=0;j<n;j++)
12              {
13                  if (!visited[j] && adjset[j]<nlen)
14                  {
15                      nlen = adjset[j];
16                      nid = j;
17                  }
18              }
19              //訪問找到的那個點
20              len += nlen;
21              visited[nid] = 1;
22              //更新鄰接距離
23              for (j=0;j<n;j++)
24              {
25                  if (!visited[j] && map[j][nid]<adjset[j])
26                  {
27                      adjset[j] = map[j][nid];
28                  }
29              }

Dijkstra算法

 1 void Dijkstra(int v)
 2 {
 3     int i,j,min,nxt;
 4     for(i=1;i<=n;i++)    cls[i]=map[v][i];
 5     memset(vis,0,sizeof(vis));
 6     vis[v]=1;
 7     for (i=1;i<n;i++)
 8     {
 9         min=MAX;
10         nxt=v;
11         for (j=1;j<=n;j++)
12         {
13             if(!vis[j]&&cls[j]<min)
14             {
15                 nxt=j;
16                 min=cls[j];
17             }
18         }
19         vis[nxt]=1;
20         for (j=1;j<=n;j++)
21         {
22             if(!vis[j]&&map[nxt][j]<MAX&&(min+map[nxt][j])<cls[j])
23                 cls[j]=cls[nxt]+map[nxt][j];
24         }
25     }
26 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM