算法导论-24.1-Bellman-Ford算法
2012-08-10 17:07
253 查看
一、概念
二、代码
三、练习
24.1-1
注:s=1,t=2,x=3,z=4,y=5
(1)以s为源点
第1轮:
d:2 8 7 0 9
p:4 1 4 -1 1
第2轮:
d:2 5 6 0 9
p:4 3 5 -1 1
第3轮:
d:2 4 6 0 9
p:4 3 5 -1 1
第4轮:
d:2 4 6 0 9
p:4 3 5 -1 1
(2)将边(z,x)的权值变为4,再s为源点运行此算法
第1轮:
d:0 6 2147483647 2147483647 7
p:-1 1 -1 -1 1
第2轮:
d:0 6 4 2 7
p:-1 1 5 2 1
第3轮:
d:0 2 4 2 7
p:-1 3 5 2 1
第4轮:
d:0 2 2 -2 7
p:-1 3 4 2 1
24.1-3
24.1-4
24.1-5
24.1-6
二、代码
//用邻接表实现图的转置 #include <iostream> using namespace std; #define N 5 //点 #define M 10 //边 //边结点结构 struct Edge { int start;//有向图的起点 int end;//有向图的终点 int value; }; //顶点属性 struct Vertex { int d;//与的源点的距离 int p;//在最短路径树中的父结点 }; Vertex V[N+1];//顶点集合 Edge E[M+1];//边集合 //初始化 void Initialize_Single_Source(int s) { int i; for(i = 1; i <= N; i++) { V[i].d = 0x7fffffff; V[i].p = -1; } V[s].d = 0; } //松弛技术 void Relax(int u, int v, int w) { if(V[u].d != 0x7fffffff && V[v].d > V[u].d + w) { V[v].d = V[u].d + w; V[v].p = u; } } //输出每个顶点的属性 void Print() { int i; for(i = 1; i <= N; i++) cout<<V[i].d<<' '; cout<<endl; for(i = 1; i <= N; i++) cout<<V[i].p<<' '; cout<<endl; } //Bellman_Ford算法 bool Bellman_Ford(int s) { int i, j; //初始化 Initialize_Single_Source(s); //对图的边进行|V|-1遍操作 for (i = 1; i < N; i++) { cout<<"第"<<i<<"轮:"<<endl; //依次对每条边进行松弛操作 for(j = 1; j <= M; j++) { Relax(E[j].start, E[j].end, E[j].value); } //输出每一轮松弛后的结果 Print(); } //对负权回路进行检查 for(j = 1; j <= M; j++) { if(V[E[j].end].d > V[E[j].start].d + E[j].value) return false; } return true; } /* 2 3 5 2 5 8 2 4 -4 3 2 -2 5 3 -3 5 4 9 4 3 7 4 1 2 1 2 6 1 5 7 */ int main() { int i; //输入边 for(i = 1; i <= M; i++) cin>>E[i].start>>E[i].end>>E[i].value; //Bellman_Ford算法 Bellman_Ford(1); return 0; }
三、练习
24.1-1
注:s=1,t=2,x=3,z=4,y=5
(1)以s为源点
第1轮:
d:2 8 7 0 9
p:4 1 4 -1 1
第2轮:
d:2 5 6 0 9
p:4 3 5 -1 1
第3轮:
d:2 4 6 0 9
p:4 3 5 -1 1
第4轮:
d:2 4 6 0 9
p:4 3 5 -1 1
(2)将边(z,x)的权值变为4,再s为源点运行此算法
第1轮:
d:0 6 2147483647 2147483647 7
p:-1 1 -1 -1 1
第2轮:
d:0 6 4 2 7
p:-1 1 5 2 1
第3轮:
d:0 2 4 2 7
p:-1 3 5 2 1
第4轮:
d:0 2 2 -2 7
p:-1 3 4 2 1
24.1-3
24.1-4
24.1-5
24.1-6
相关文章推荐
- 算法导论-24.1-Bellman-Ford算法
- 算法导论 习题24.1-4&24.1-5&24.1-6 (Bellman-Ford算法的变形)
- 算法导论-第24章- 单源最短路径 - 24.1 Bellman-Ford 算法
- 单源最短路之spfa算法代码(bellman-ford算法的队列优化)
- Bellman_Ford算法->SPFA算法
- POJ 1860 Bellman-Ford算法
- 最短路之Bellman-Ford算法
- Bellman-Ford算法
- Bellman_Ford算法
- Bellman-Ford算法
- 最短路径(Floyd算法和Dijkstra算法和Bellman-Ford算法)
- Bellman-Ford算法
- 练习题 No.22 单源最短路问题(Bellman-Ford算法)
- HDU 3259 Wormholes(Bellman-Ford算法)
- POJ 3259 bellman_ford算法
- POJ1860—Bellman-Ford算法
- 《算法4》最短路径之Dijkstra与Bellman-Ford算法
- 加权有向图----一般性单源最短路径问题(Bellman-Ford算法)
- POJ3259--Wormholes--Bellman-Ford算法经典题
- PKU3259(Wormholes)判定负权环-Bellman_Ford算法