Bellman Ford 最短路径算法
2014-06-03 09:35
323 查看
Dijsktra算法不能计算带负数路径的图 - 因为Dijsktra只更新当前最小路径的权值,并不会更新之后找到的新的最短路径值 - 当有负数的时候这种情况是会出现的,没有负数的情况下是不可能出现的。
而Bellman Ford是可以处理这种情况的。
但是注意两种算法都不肯能处理出现负权值环的问题,负权值环出现好像也没有实际意义吧?没仔细研究过,不过负权值的环会导致无限小的的值,因为可以无线走这个环换取更小的权值。
参考:http://www.geeksforgeeks.org/dynamic-programming-set-23-bellman-ford-algorithm/
参考文两点小瑕疵,1 没处理溢出问题, 2 给出的图不够完善,可以使用Dijsktra处理。
我这里创建一个无法使用Dijsktra处理的简单的图:
输出:
大家可以试一试,这样的图使用Dijkstra处理,结果是错误的。
而Bellman Ford是可以处理这种情况的。
但是注意两种算法都不肯能处理出现负权值环的问题,负权值环出现好像也没有实际意义吧?没仔细研究过,不过负权值的环会导致无限小的的值,因为可以无线走这个环换取更小的权值。
参考:http://www.geeksforgeeks.org/dynamic-programming-set-23-bellman-ford-algorithm/
参考文两点小瑕疵,1 没处理溢出问题, 2 给出的图不够完善,可以使用Dijsktra处理。
我这里创建一个无法使用Dijsktra处理的简单的图:
#pragma once #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> class BellmanFord { struct Edge { int src, des, wei; }; struct Graph { int V, E; Edge *edges; Graph(int v, int e) : V(v), E(e) { edges = new Edge[e]; } ~Graph() { if (edges) delete edges, edges = NULL; } }; void printArr(int dist[], int n) { printf("Vertex Distance from Source\n"); for (int i = 0; i < n; ++i) printf("%d \t\t %d\n", i, dist[i]); } void bellmanFord(Graph *gra, int src, int *dist) { int V = gra->V, E = gra->E; dist[src] = 0; for (int v = 1; v < V; v++) { for (int e = 0; e < E; e++) { int i = gra->edges[e].src; int j = gra->edges[e].des; int w = gra->edges[e].wei; //handle overflow if (dist[i] != INT_MAX && dist[i] + w < dist[j]) { dist[j] = dist[i] + w; } } } for (int e = 0; e < E; e++) { int u = gra->edges[e].src; int v = gra->edges[e].des; int w = gra->edges[e].wei; if (dist[u] != INT_MAX && dist[u] + w < dist[v]) printf("Graph contains negative weight cycle"); } } public: BellmanFord() { /* Let us create the graph given in above example */ int V = 5; // Number of vertices in graph int E = 4; // Number of edges in graph struct Graph* graph = new Graph(V, E); /* // add edge 0-1 (or A-B in above figure) graph->edges[0].src = 0; graph->edges[0].des = 1; graph->edges[0].wei = -1; // add edges 0-2 (or A-C in above figure) graph->edges[1].src = 0; graph->edges[1].des = 2; graph->edges[1].wei = 4; // add edges 1-2 (or B-C in above figure) graph->edges[2].src = 1; graph->edges[2].des = 2; graph->edges[2].wei = 3; // add edges 1-3 (or B-D in above figure) graph->edges[3].src = 1; graph->edges[3].des = 3; graph->edges[3].wei = 2; // add edges 1-4 (or A-E in above figure) graph->edges[4].src = 1; graph->edges[4].des = 4; graph->edges[4].wei = 2; // add edges 3-2 (or D-C in above figure) graph->edges[5].src = 3; graph->edges[5].des = 2; graph->edges[5].wei = 5; // add edges 3-1 (or D-B in above figure) graph->edges[6].src = 3; graph->edges[6].des = 1; graph->edges[6].wei = 1; // add edges 4-3 (or E-D in above figure) graph->edges[7].src = 4; graph->edges[7].des = 3; graph->edges[7].wei = -3; */ graph->edges[0].src = 0; graph->edges[0].des = 1; graph->edges[0].wei = -8; graph->edges[1].src = 0; graph->edges[1].des = 3; graph->edges[1].wei = -3; graph->edges[2].src = 1; graph->edges[2].des = 2; graph->edges[2].wei = -2; graph->edges[3].src = 2; graph->edges[3].des = 3; graph->edges[3].wei = 5; int *dist = new int[V]; for (int i = 0; i < V; i++) { dist[i] = INT_MAX; } bellmanFord(graph, 0, dist); printArr(dist, V); delete dist; } };
输出:
大家可以试一试,这样的图使用Dijkstra处理,结果是错误的。
相关文章推荐
- Bellman ford 最短路径算法
- leetcode 743. Network Delay Time 图最短路径 + Bellman Ford 算法
- 图--单源最短路径 -Bellman Ford 算法(可以存在负权边的情况和负权回路)算法导论p362
- Bellman ford 最短路径算法
- 【算法导论】单源最短路径之Bellman-Ford算法
- 最短路径算法 hdu2544
- 菜鸟学算法之--Dijkstra最短路径算法
- floyd最短路径算法
- Dijkstra(迪杰斯特拉)最短路径算法分析
- 最短路径算法——Floyd
- 图中最短路径算法
- 算法导论——24.2 DAG最短路径算法java实现
- 数据结构之 迪杰斯特拉最短路径算法
- 图论之Dijkstra最短路径算法
- 最短路径算法(3)—Floyd(弗洛伊德)算法
- 利用Breadth-First Search (BFS)算法寻找图中的最短路径和所有路径
- 无向图的最短路径求解算法之——Dijkstra算法
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- 所有结点对的最短路径问题之Johnson算法
- 图的最短路径算法(Dijkstra,Floyd)的实现