社区讨论

Bellman-Ford求具体方案

灌水区参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m0592uon
此快照首次捕获于
2024/08/22 20:19
2 年前
此快照最后确认于
2024/08/22 20:32
2 年前
查看原帖
Bellman-ford 是一个求最短路径的基于贪心思想的算法,标准代码如下:
CPP
for(int i=1;i<=T-1;i++){
    for(int j=1;j<=C;j++){
        if(dis[e[j].b]>dis[e[j].a]+e[j].f){
            dis[e[j].b]=dis[e[j].a]+e[j].f;
        }
        if(dis[e[j].a]>dis[e[j].b]+e[j].f){
            dis[e[j].a]=dis[e[j].b]+e[j].f;
        }
    }
}
为了求出具体方案,我们可以构建一个 prepre 数组,其中 preipre_i 表示在最短路径中, preipre_i 的下一个点是 ii
我们以余博士教编程_酷哥OJ_酷哥爱编程_酷哥创客AI编程_OnlineJudge的第1582题为例,我们可以在dis[e[j].a]=dis[e[j].b]+e[j].f;}之间和dis[e[j].b]=dis[e[j].a]+e[j].f;}之间分别添加语句pre[e[j].a]=e[j].b;pre[e[j].b]=e[j].a;,最后写一个 printprint 函数就好了。 标准代码如下:
CPP
#include<bits/stdc++.h>
using namespace std;
int T,C,Ts,Te;
struct Edge{
    int a,b,f;
}e[7000];
int dis[3000],pre[3000];
void print(int x){
    if(x==Ts){
        cout<<Ts;
        return;
    }
    print(pre[x]);
    cout<<"->"<<x;
}
int main(){
    cin>>T>>C>>Ts>>Te;
    for(int i=1;i<=C;i++){
        cin>>e[i].a>>e[i].b>>e[i].f;
    }
    memset(dis,0x3f,sizeof(dis));
    dis[Ts]=0;
    for(int i=1;i<=T-1;i++){
        for(int j=1;j<=C;j++){
            if(dis[e[j].b]>dis[e[j].a]+e[j].f){
                dis[e[j].b]=dis[e[j].a]+e[j].f;
                pre[e[j].b]=e[j].a;
            }
            if(dis[e[j].a]>dis[e[j].b]+e[j].f){
                dis[e[j].a]=dis[e[j].b]+e[j].f;
                pre[e[j].a]=e[j].b;
            }
        }
    }
    cout<<dis[Te]<<endl;
    print(Te);
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...