当存在负权边的时候,最短路都不一定存在,比如说负环。
所以我们平时说的最短路一定是不含有环的,不管是dijkstra还是其他求最短路的问题,都是如此。
因为环存在三种情况,正环,负环和零环,而这三种环肯定不可能出现在最短路的路径中。如果存在这个肯定不能是最短路了(自己思考一下,很简单的)
排除了环,但是如果存在负边在图中,用dijkstra是不能求出最短路的(思考)。
所以当一个有负权边时就要用bellman-ford或者folyd求解了。
bellman-ford 算法 是一个典型的动态规划问题。
此算法为了避免环的影响,做一限制了源点到目标点得走得边数,即n 个顶点的图,最多走n-1路,所以最短路径是在 1到n-1 条边之内就能找到。
则设dist[K][ V] k 从1 到 n-1 V 为目标点。所以状态方程为:
dist[K][V] = min{ dist[K-1][V] + min{ dist[K-1][j] + map[j][v] } }
K: 1->n-1 V: 1->n 但不包括源点。 j: 1->n 所以一种是三层循环
下面是bellman-ford算法:
#define INF 1000000000
#define MAXN 8
int n;
int map[MAXN][MAXN];
int lowcost[MAXN];
void Bellman( int start )
{
int i, j, k, u;
for( i = 0; i < n; i++ )
lowcost[i] = map[start][i];
for( k = 2; k &l