编程算法 - 单源最短路问题 Bellman-Ford 代码(C)

单源最短路问题 Bellman-Ford 代码(C)


本文地址: http://blog.csdn.net/caroline_wendy


单源最短路: 固定一个起点, 求它到其他所有点的最短路的问题.


Bellman-Ford: 设当前到顶点i的最短路长度为d[i], 并设初值d[s]=0, d[i]=INF, 

再不断使用递推关系式d[e.to] = d[e.from] + e.cost更新d的值.

时间复杂度: O(V*E)


代码:

/*
 * CppPrimer.cpp
 *
 *  Created on: 2013.11.12
 *      Author: Caroline
 */

/*eclipse cdt*/

#include <stdio.h>
#include <limits.h>

#include <vector>

using namespace std;

class Program {
	static const int MAX_V = 100;
	static const int MAX_E = 100;
	const int INF = INT_MAX>>2;

	struct edge {int from, to, cost; };
	edge es[MAX_E] = {
			{0,1,2}, {0,2,5},
			{1,0,2}, {1,2,4}, {1,3,6}, {1,4,10},
			{2,0,5}, {2,1,4}, {2,3,2},
			{3,2,2}, {3,1,6}, {3,5,1},
			{4,1,10}, {4,5,3}, {4,6,5},
			{5,3,1}, {5,4,3}, {5,6,9},
			{6,4,5}, {6,5,9}
	};
	int V = 7, E = 20;
public:
	int d[MAX_V];
	void shortest_path(int s) {
		for (int i=0; i<V; ++i) d[i] = INF;
		d[s] = 0;
		while (true) {
			bool update = false;
			for (int i=0; i<E; i++) {
				edge e = es[i];
				if (d[e.from] != INF && d[e.to] > d[e.from] + e.cost) {
					d[e.to] = d[e.from] + e.cost;
					update = true;
				}
			}
			if (!update) break;
		}
	}
};

int main (void)
{
	Program iP;
	iP.shortest_path(0);
	for (int i=0; i<7; i++) {
		printf("%d = %d\n", i, iP.d[i]);
	}

	return 0;

}

输出:

0 = 0
1 = 2
2 = 5
3 = 7
4 = 11
5 = 8
6 = 16

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/caroline_wendy/article/details/38170717
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞