关于最短路径中的Dijkstra和Bell-man算法的区别
2016-04-22 17:02
363 查看
Bell-man算法和Dijkstra算法都是最短路径的算法,都可以用于求,单源点最短路径的问题,那么它们的区别在于什么呢?
想了很久,该怎样去总结它们的区别,最后我认为从两方面总结,是比较合适的:用途特性,算法本身的区别。
那么算法适用于什么样的情况,应该是有算法本身的特性来决定的,所以,算法本身的区别是关键,下面就来说明两个算法各自最核心的部分:
Dijkstra:
1. 初始化:将d[ ] 全部设为INF,特别的是d[s] = 0; 将标记数组vis[ ] 全部设为1,特别的是vis[s]
= 1;
2. for ( int i = 0; i < n; ++i ) {
在所有未标记的结点中,选择最小的x, 然后从x开始,修改其他结点的d[i]值,d[i]
<?= d[x] + w[x][i];
}
其实就是将所有分成了两个部分,标记和未标记,然后在所有未标记的集合中,选最小的,加入到标记中,从这个结点开始,修改其他节点的最短路。可以证明,这个算法是正确的,它包含了DP和贪心的思想。
Bell-man:
与Dijkstra不同的是,这个算法每次只是从队头拿出结点,修改与之相邻的节点,即进行松弛操作,d[i] <?= d[u]+w[u][i];
并不会找d[i]最小的点,它是通过动态的修正、收敛来实现最短路径的。
1. 初始化:queue, d[i] = INF, d[s] = 0, vis[i] = false,
vis[s] = 0;
2. while
( !empty(queue) ) {
u = front; vis[u]=false;
for( i = 0; i < n; ++i ) if(d[i] > d[u] + w[u][i] ) {
d[i] = d[u]+w[u][i]; if ( !vis[i] ) {vis[i] = true; push(i);}
}
}
用途特性:
主要从时间复杂度来分析,D是n*n, B是m*n, 可以看出,如果边比较多的情况下,姐稠密图,用D比较稳定,而稀疏图中,B是首选!
想了很久,该怎样去总结它们的区别,最后我认为从两方面总结,是比较合适的:用途特性,算法本身的区别。
那么算法适用于什么样的情况,应该是有算法本身的特性来决定的,所以,算法本身的区别是关键,下面就来说明两个算法各自最核心的部分:
Dijkstra:
1. 初始化:将d[ ] 全部设为INF,特别的是d[s] = 0; 将标记数组vis[ ] 全部设为1,特别的是vis[s]
= 1;
2. for ( int i = 0; i < n; ++i ) {
在所有未标记的结点中,选择最小的x, 然后从x开始,修改其他结点的d[i]值,d[i]
<?= d[x] + w[x][i];
}
其实就是将所有分成了两个部分,标记和未标记,然后在所有未标记的集合中,选最小的,加入到标记中,从这个结点开始,修改其他节点的最短路。可以证明,这个算法是正确的,它包含了DP和贪心的思想。
Bell-man:
与Dijkstra不同的是,这个算法每次只是从队头拿出结点,修改与之相邻的节点,即进行松弛操作,d[i] <?= d[u]+w[u][i];
并不会找d[i]最小的点,它是通过动态的修正、收敛来实现最短路径的。
1. 初始化:queue, d[i] = INF, d[s] = 0, vis[i] = false,
vis[s] = 0;
2. while
( !empty(queue) ) {
u = front; vis[u]=false;
for( i = 0; i < n; ++i ) if(d[i] > d[u] + w[u][i] ) {
d[i] = d[u]+w[u][i]; if ( !vis[i] ) {vis[i] = true; push(i);}
}
}
用途特性:
主要从时间复杂度来分析,D是n*n, B是m*n, 可以看出,如果边比较多的情况下,姐稠密图,用D比较稳定,而稀疏图中,B是首选!
相关文章推荐
- Hdu2066(一个人的旅行)
- Poj2638 网络流+最短路+二分答案
- Aizu1311 分层图最短路 (...大概)
- 最短路径 -- spfa
- 单源最短路深度分析
- hdu5137最短路
- hdoj 1874 畅通工程 vector邻接表测试
- poj 3255 Roadblocks
- 【POJ1860】Currency Exchange
- Dijkstra求最短路与次短路
- 2014西安邀请赛部分题解
- 2014 西安邀请赛状压DP
- 2013长沙邀请赛Travel in time
- 最短路dij——POJ 2387 Til the Cows Come Home题解
- 带负权的最短路bellman_ford——POJ 3259 Wormholes题解
- hdu 2544 最短路(简单的Floyd)
- hdu 3790 最短路径问题 (dijkstra算法+memset()用法)
- poj 2253 Frogger(dijkstra)
- hdu 2544 最短路 (Bellman_Ford算法)
- hdu 2690 Choose the best route (bellman_ford)