Dijkstra算法与Prim算法的区别
2014-08-21 10:53
288 查看
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集合中结束。
以下给出具体实现代码:
2.dijkstra算法过程:
(1)初始时,S只包含源点,即S=,v的距离为0。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中。
以下给出具体实现代码:
3.小总结
1:Prim是计算最小生成树的算法,比如为N个村庄修路,怎么修花销最少。
Dijkstra是计算最短路径的算法,比如从a村庄走到其他任意村庄的距离。
2:Prim算法中有一个统计总len的变量,每次都要把到下一点的距离加到len中;
Dijkstra算法中却没有,只需要把到下一点的距离加到dist[]数组中即可;
3:Prim算法的更新操作更新的dist[]是已访问集合到未访问集合中各点的距离;
Dijkstra算法的更新操作更新的dist[]是源点到未访问集合中各点的距离;
4.具体例题
(1)Prim算法例题:/article/10670900.html
(2)Dijkstra算法例题:/article/10670904.html
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只包含源点,即S=,v的距离为0。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算法例题:/article/10670900.html
(2)Dijkstra算法例题:/article/10670904.html
相关文章推荐
- Prim算法与Dijkstra算法的区别
- Prim算法与Dijkstra算法的联系与区别
- 比较Dijkstra算法和最小生成树prim算法之间的区别
- dijkstra算法与prim算法的区别
- Prim算法与Dijkstra算法的区别
- dijkstra算法与prim算法的区别
- dijkstra算法与prim算法的区别
- Prim算法与Dijkstra算法的区别
- 学习进度2012-6-26(动态规划算法、Prim算法、Dijkstra算法)
- 关于prim算法与dijskra算法得区别
- Dijkstra和Prim算法的区别
- prime算法和dijkstra算法的主要区别,以及实现
- Prim和Dijkstra算法的区别
- 【算法】prim算法(最小生成树)(与Dijkstra算法的比较)
- Prim算法和Dijkstra算法的异同
- 编程实现prim算法和Dijkstra算法。
- Prim算法和Dijkstra算法的异同
- Dijkstra算法与Prim算法的异同
- Dijkstra算法、Floyd算法的区别与联系,并由此谈到greedy和DP
- Prim和Dijkstra算法的区别