bellman-ford算法

同为最短路径算法,单源节点至其他所有节点的最短路径,Bellman-Ford算法由美国数学家、动态规划创始人Richard Bellman及Lester Ford发明于20世纪50年代。该算法的提出主要是基于这样一个事实:如果一个图中没有权值和为负值的回路(non-negative-weight cycle),那么从某个节点至其他节点的最短路径不会超过|V|-1条边,其中V表示一个图的定点个数。所以在这个算法了里,我们循环地做|V|-1次,每次对所有的边进行松弛(relax),循环结束之后距离数组中的值就是最后的结果。

/*
 * szl_bellman_ford.h
 */
#ifndef SZL_BELLMAN_FORD_H
#define SZL_BELLMAN_FORD_H

void szl_bellman_ford(int* graph[], int source, int destination);
#endif

/*
 * szl_bellman_ford.c
 */
#include "szl_bellman_ford.h"
#include 
#include 
#include 
#include 
void szl_bellman_ford(int* graph[], int source, int destination);

int n,m;
int main( int argc ,char ** argv){
	int **graph;
	int i,j;
	int u,v,w;
	/*
	 * the source node and the destination node
	 */
	int s,d;
	/*
	 * read from a file in the current directory named 'data.txt'
	 */
	FILE* data_file;
	
	if( 1 == argc){
		data_file=fopen("data.txt", "r");
	}
	else{
		data_file=fopen(argv[1], "r");
	}
	assert(NULL!=data_file);

	//printf("input vertices and edges.\n");
	fscanf(data_file,"%d%d",&n,&m);
	
	/*
	 * implement a graph with matrix
	 */
	graph=(int **)malloc(sizeof(int *) * n);
	assert(NULL != graph);
	for(i=0;i dist_last[u] + graph[u][v]){
							dist[v] = dist_last[u] + graph[u][v];
							predecessor[v] = u;
						}
					}
				}
			}
		}
	}

	/**
	 * check negative-weight cycle
	 */
	for(u=0;u=0;j--){
		printf("%d",stack[j]);
		if(j>0){
			printf(", ");
		}

	}

	//free
	free(dist);
	free(dist_last);
	free(dis_infinite);
	free(predecessor);
	free(stack);
}

下面是测试数据,首先是没有负权的有向图(这个图和上一篇博客dijkstra算法的测试图示一样的):

文件data2.txt:

8 15
0 2 9
0 6 14
0 7 15
2 3 24
3 5 2
3 1 19
4 3 6
4 1 6
5 4 11
5 1 16
6 3 18
6 5 30
6 7 5
7 5 20
7 1 44
0 1

即图:


执行:


看见结果是正确的。

测试文件data.txt

9 16
0 1 9
0 2 7
0 3 4
1 4 -4
2 3 -4
2 5 3
3 1 5
3 4 3
3 6 2
4 6 -2
4 8 -3
5 3 -8
5 7 -3
6 7 5
6 8 2
7 8 -7
0 8

测试结果:


也就是这图(从网上下载的):


你可能感兴趣的:(经典算法)