Bellman-Ford算法实现
2016-07-27 07:33
453 查看
根据算法导论里面的算法实现的。如下:
输入文件格式:
其中, 第一行为源顶点,第二行行分别为顶点个数,和边的个数。以下每行分别为每条边的起始,终止顶点和权值。
输出:
(0, 1): 2
(0, 2): 4
(0, 3): -2
(0, 4): 7
#include <stdio.h> struct vertex { int weight; int dist; int parent; }; #define MAX_SIZE 50 struct vertex data[MAX_SIZE][MAX_SIZE]; int size; int source; #define MAX_VALUE (1 << 31 -1 ) //int short_dist[MAX_SIZE]; void read_data(void) { scanf("%d", &source); int edges; scanf("%d %d", &size, &edges); int i, j; for(i = 0; i < size; i++) { for(j = 0; j < size; j++) { if(i != j) { data[i][j].weight = MAX_VALUE; } else { data[i][j].weight = 0; } } } for(i = 0; i < edges; i++) { int p, q; scanf("%d %d", &p, &q); scanf("%d", &data[p][q].weight); } } void init_single_source(int s) { int i; for(i = 0; i < size; i++) { if( i != s) { data[s][i].dist = MAX_VALUE; } else { data[s][i].dist = 0; } } } int bellman_ford(int s) { init_single_source(s); int k; for(k = 1; k < size; k++) { int i, j; for(i = 0; i < size; i++) { for(j = 0; j < size; j++) { if(data[i][j].weight < MAX_VALUE) { if(data[s][i].dist < MAX_VALUE && data[s][j].dist > data[s][i].dist + data[i][j].weight) { data[s][j].dist = data[s][i].dist + data[i][j].weight; } } } } } int i, j; for(i = 0; i < size; i++) { for(j = 0; j < size; j++) { if(data[i][j].weight < MAX_VALUE) { if(data[s][j].dist > data[s][i].dist + data[i][j].weight) { return 0; } } } } return 1; } int main(int argc, char **argv) { read_data(); int ret = bellman_ford(source); if(ret == 0) { printf("contains a negative cycle\n"); } else { int i; for(i = 1; i < size; i++) { printf("(%d, %d): %d\n", source, i, data[source][i].dist); } // printf("ok\n"); } return 0; }
输入文件格式:
0 5 10 0 1 6 1 2 5 2 1 -2 0 4 7 1 4 8 1 3 -4 3 2 7 3 0 2 4 3 9 4 2 -3
其中, 第一行为源顶点,第二行行分别为顶点个数,和边的个数。以下每行分别为每条边的起始,终止顶点和权值。
输出:
(0, 1): 2
(0, 2): 4
(0, 3): -2
(0, 4): 7
相关文章推荐
- Javascript SHA-1:Secure Hash Algorithm
- 浏览器运行java插件报错:Algorithm constraints check failed: MD5withRSA
- Ubuntu SSH Algorithm negotiation failed
- [转]可视化的数据结构和算法
- 统计文件中不小于某一长度的单词的个数(泛型算法实现)
- 初学图论-Bellman-Ford单源最短路径算法
- 使用他人的MD5编码类,修改形成密码串
- Extracting Structured Data from Web Pages
- (译)Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.13使用CCTexture2DMutable调换调色盘
- Java中3DES加密
- Refactoring Notes-Refactoring Methods(3)
- 图书馆管理程序~~不过貌似功能!!有空再修修
- trainging contest#2(2011成都现场赛)I BY Hyoga
- C/C++头文件包含内容概览
- 堆栈的应用(1) 平衡符号 C++实现
- 程序员编程艺术第一章、左旋转字符串
- 程序员编程艺术:第三章续、Top K算法问题的实现
- 程序员编程艺术:第四章、现场编写类似strstr/strcpy/strpbrk的函数
- 十四、第三章再续:快速选择SELECT算法的深入分析与实现
- 程序员编程艺术:第七章、求连续子数组的最大和