最短路
Bellman-Ford
struct Edge {
int x, y, v;
}edge[10010];//存边
int n, m, k;
int dis[5010];//dis[i]表示从s到i的最短距离
int pre[5010];//记录连接该节点的上一个节点
int c[5010];
void Bellman(int s,int t) {//最多迭代n-1轮
memset(dis, 127, sizeof(dis));
memset(pre, 0, sizeof(pre));
dis[s] = 0;
while (true) {
bool ok = false;//记录在当前的迭代过程中是否遍历,若没有,循环结束
for (int i = 1; i <= m; i++) {
int x = edge[i].x, y = edge[i].y, v = edge[i].v;
if (dis[x] < 1 << 30) {
if (dis[x] + v < dis[y]) {
dis[y] = dis[x] + v;
pre[y] = x;
ok = true;
}
}
}
if (!ok) break;
}
if (dis[t] < 1 << 30) {
printf("%d\n", dis[t]);
/*输出从s到t的最短路,用c存放
int l = 0;
for (int i = t; i != s; i=pre[i]) {
c[++l] = i;
}
c[++l] = s;
for (int i = l; i >= 1; i--) cout << c[i] << " \n"[i == 1];
*/
}
else printf("-1\n");
}
void solve() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= m; i++) {
int x, y, v;
scanf("%d%d%d", &x, &y, &v);
edge[i].x = x, edge[i].y = y, edge[i].v = v;
}
while (k--) {
int x, y;
scanf("%d%d", &x, &y);
Bellman(x, y);
}
}S P F A
Dijkstra
Floyd
Last updated