Dijkstra算法与Prim算法的区别

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。Dijkstra算法与Prim算法的区别,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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.具体例题

(1)Prim算法例题:http://blog.csdn.net/u012856866/article/details/38684173

(2)Dijkstra算法例题:http://blog.csdn.net/u012856866/article/details/38726411

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/163055.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!