Bellman-ford求具体方案
  • 板块灌水区
  • 楼主1386819340qa
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/11 20:47
  • 上次更新2024/7/11 22:08:09
查看原帖
Bellman-ford求具体方案
1350009
1386819340qa楼主2024/7/11 20:47

Bellman-ford是一个求最短路径的基于贪心思想的算法,标准代码如下:

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 函数就好了。 标准代码如下:

#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;
}
2024/7/11 20:47
加载中...