BellmanFord 单源最短路 O(VE)| 能在一般情况下,包括存在负权边的情况下,解决单源最短路径问题

| BellmanFord 单源最短路 O(VE)
| 能在一般情况下,包括存在负权边的情况下,解决单源最短路径问题
| INIT: edge[E][3] 为边表
| CALL: bellman(src); 有负环返回 0;dist[i] src i 的最短距
| 可以解决差分约束系统 : 需要首先构造约束图,构造不等式时 >= 表示求最
小值 , 作为最长路, <= 表示求最大值 , 作为最短路 v-u <= c:a[u][v] =
c
\*==================================================*/
#define typec int // type of cost
const typec inf=0x3f3f3f3f; // max of cost
int n, m, pre[V], edge[E][3];
typec dist[V];
int relax ( int u, int v, typec c){
if (dist[v] > dist[u] + c) {
dist[v] = dist[u] + c;
pre[v] = u; return 1;
}
return 0;
}
int bellman ( int src){
int i, j;
for (i=0; i
dist[i] = inf; pre[i] = -1;
}
dist[src] = 0; bool flag;
for (i=1; i
flag = false; // 优化
for (j=0; j
if( 1 == relax(edge[j][0], edge[j][1],
edge[j][2]) ) flag = true;
}
if( !flag ) break; }
for (j=0; j
if (1 == relax(edge[j][0], edge[j][1], edge[j][2]))
return 0; // 有负圈
}
return 1;
}

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