社区讨论
Bellman-Ford求具体方案
灌水区参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m0592uon
- 此快照首次捕获于
- 2024/08/22 20:19 2 年前
- 此快照最后确认于
- 2024/08/22 20:32 2 年前
Bellman-ford 是一个求最短路径的基于贪心思想的算法,标准代码如下:
CPPfor(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;
}
}
}
为了求出具体方案,我们可以构建一个 数组,其中 表示在最短路径中, 的下一个点是 。
我们以余博士教编程_酷哥OJ_酷哥爱编程_酷哥创客AI编程_OnlineJudge的第1582题为例,我们可以在
CPPdis[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;,最后写一个 函数就好了。 标准代码如下:#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 条回复,欢迎继续交流。
正在加载回复...