1. 程式人生 > >Dijkstra演算法與Prim演算法的區別

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.具體例題