多段图的最短路径问题:只有相邻的节点之间有联系
多段图的定义:
1.多段图是一个有向、无环、带权 图
2.有且仅有一个起始结点原点source) 和 一个终止结点汇点target)。
3.它有n个阶段,每个阶段由特定的几个结点构成。每个结点的所有结点都只能指向下一个相邻的阶段,阶段之间不能越界。

算法步骤:
从前往后依次给所有结点编号;序号必须从0开始,依次递增,同一阶段的结点顺序可以随意;

1.计算s->t的最短路径问题:首先进行部分分解d(s,v)
递推公式:

2.根据递推公式求出该图的最短路径问题:

所以最终的最短距离是16
算法求解:使用Dijkstra算法Bellman-ford算法SPFA算法求解
注:Bellman-ford算法SPFA算法适用于有向无环带负权图。
path[maxx]记录路径,其实这里我并没有用到这个数组,我用的是递归输出路径的;
e[maxx][maxx]表示两点之间的权值;
pre[maxx]记录前驱节点;
vis[maxx]标记访问情况;
mincost是所求的最短路径;

Dijkstra算法
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<cstdio>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
int path[maxx];
int e[maxx][maxx];
int dist[maxx];
int pre[maxx];
int vis[maxx];
int n,m;
int mincost;
void init(){mincost=0;memset(path,0,sizeof(path));memset(dist,inf,sizeof(dist));memset(vis,0,sizeof(vis));memset(pre,0,sizeof(pre));for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j){e[i][j]=0;}else{e[i][j]=inf;}}}
}
void Print(int i){if(i==1)return ;Print(pre[i]);cout<<"->"<<i-1;
}
void Mindist(int s,int v){for(int i=1;i<=n;i++){if(e[s][i]!=inf&&i!=s){dist[i]=e[s][i];pre[i]=s;}}vis[s]=1;dist[s]=0;for(int i=1;i<=n;i++){int temp=inf;int t=s;for(int j=1;j<=n;j++){if(!vis[j]&&dist[j]<temp){temp=dist[j];t=j;}}if(t==s)break;vis[t]=1;for(int j=1;j<=n;j++){if(e[t][j]<inf){if(!vis[j]&&dist[j]>dist[t]+e[t][j]){dist[j]=dist[t]+e[t][j];pre[j]=t;}}}}cout<<"最短距离: "<<dist[v]<<endl; cout<<s-1;Print(v);cout<<endl;
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){if(n==0&&m==0)break;init();for(int i=1;i<=m;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);a++;b++;e[a][b]=cost;}Mindist(1,n);}return 0;
}10 18
0 1 4
0 2 2
0 3 3
1 4 9
1 5 8
2 4 6
2 5 8
2 6 8
3 6 7
3 5 4
4 7 5
4 8 6
5 7 8
5 8 6
6 7 6
6 8 5
7 9 7
8 9 3

Bellman-ford算法求解:这里我们不需要判断负环
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<cstdio>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
int path[maxx];
int dist[maxx];
int pre[maxx];
int vis[maxx];
int n,m;
int mincost;
struct node{int u,v;int w;
}e[maxx];
void init(){mincost=0;memset(path,0,sizeof(path));memset(dist,inf,sizeof(dist));memset(vis,0,sizeof(vis));memset(pre,0,sizeof(pre));
}
void Print(int i){if(i==1)return ;Print(pre[i]);cout<<"->"<<i-1;
}
void Bellman_ford(int s,int v){dist[s]=0;int flag;for(int i=1;i<=n-1;i++){flag=1;for(int j=1;j<=m;j++){if(dist[e[j].v]>dist[e[j].u]+e[j].w){dist[e[j].v]=dist[e[j].u]+e[j].w;pre[e[j].v]=e[j].u;flag=0;}}if(flag==1)break;}cout<<"最短距离: "<<dist[v]<<endl; cout<<s-1;Print(v);cout<<endl;
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){if(n==0&&m==0)break;init();for(int i=1;i<=m;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);a++;b++;e[i].u=a;e[i].v=b;e[i].w=cost;}Bellman_ford(1,n);}return 0;
}10 18
0 1 4
0 2 2
0 3 3
1 4 9
1 5 8
2 4 6
2 5 8
2 6 8
3 6 7
3 5 4
4 7 5
4 8 6
5 7 8
5 8 6
6 7 6
6 8 5
7 9 7
8 9 3

SPFA算法:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<cstdio>
#include<stack>
#include<queue>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
int e[maxx][maxx];
int path[maxx];
int dist[maxx];
int pre[maxx];
int vis[maxx];
int n,m;
int mincost;
vector<int>G[maxx];
queue<int>q;
void init(){mincost=0;memset(path,0,sizeof(path));memset(dist,inf,sizeof(dist));memset(vis,0,sizeof(vis));memset(pre,0,sizeof(pre));for(int i=1;i<=n;i++){G[i].clear();for(int j=1;j<=n;j++){if(i==j){e[i][j]=0;}else{e[i][j]=inf;}}}
}
void Print(int i){if(i==1)return ;Print(pre[i]);cout<<"->"<<i-1;
}
void SPFA(int s,int v){dist[s]=0;vis[s]=1;q.push(s);while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(dist[v]>dist[u]+e[u][v]){dist[v]=dist[u]+e[u][v];pre[v]=u;if(vis[v]==0){q.push(v);vis[v]=1;}}}}cout<<"最短距离: "<<dist[v]<<endl; cout<<s-1;Print(v);cout<<endl;
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){if(n==0&&m==0)break;init();for(int i=1;i<=m;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);a++;b++;e[a][b]=cost;G[a].push_back(b);}SPFA(1,n);}return 0;
}10 18
0 1 4
0 2 2
0 3 3
1 4 9
1 5 8
2 4 6
2 5 8
2 6 8
3 6 7
3 5 4
4 7 5
4 8 6
5 7 8
5 8 6
6 7 6
6 8 5
7 9 7
8 9 3

动态规划中的多段图问题相关推荐

  1. 多段图的动态规划算法(C/C++)

    1. 实验环境 (1)Visual Studio 2019(32位调试器) (2)Windows 10 2. 多段图描述 多段图G = (V,E)是一个带权有向图,它具有以下特性: 图中的节点被划分成 ...

  2. 动态规划多段图和货郎担问题

    一.实验目的 1.掌握能用动态规划方法求解的问题应满足的条件: 2.加深对动态规划方法的理解与应用: 3.锻炼学生对程序跟踪调试能力: 4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力. ...

  3. 算法-动态规划2图问题-多段图的最短路径问题

    算法-动态规划2-多段图的最短路径问题 多段图的最短路径问题 问题:设图G=(V,E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i< ...

  4. 动态规划——多段图问题

    多段图问题 多段图问题是利用动态规划思想解决的经典问题之一,在日常生活中应用广泛. 问题描述 若存在一个有向加权图G,且G能分出起点和终点以及中间的n的阶段,求起点到终点的最短(长)距离. 分析设计 ...

  5. 怎样把视频中的一小段制作成 GIF动图

    平常生活中大家聊天肯定会发现有很多斗图高手,不管是家人群.同学群还是好友群,从不缺乏这样的人,大多数用来斗图的图片都是GIF动图,GIF动图即有趣又形象,像小视频一样,只不过它是图片格式.大家对GIF ...

  6. 动态规划求解多段图问题

    动态规划求解多段图问题(非递归) 问题描述 求解思路 动态规划逆序解法 逆序实现代码 动态规划逆序解法 顺序实现代码 问题描述 如图所示,在A处有一水库,现需要从A点铺设一条管道到E点,边上的数字表示 ...

  7. 动态规划求解多段图最短路径

    动态规划求解多段图最短路径 题目: 分析见源代码注释 源代码: #include<stdio.h> #define N 10//定义定点数,编号从1开始 #define M 5//定义层数 ...

  8. FigDraw 20. SCI文章中绘图之马赛克图 (mosaic)

    点击关注,桓峰基因 桓峰基因公众号推出基于R语言绘图教程并配有视频在线教程,目前整理出来的教程目录如下: FigDraw 1. SCI 文章的灵魂 之 简约优雅的图表配色 FigDraw 2. SCI ...

  9. arcgis中制作出行od图_arcgis制作坡度图

    坡度图制作方法 坡度图制作方法 1 坡度分级标准 按照耕地坡度分级的要求,对耕地坡度分为五级,即小于等于 2°为Ⅰ级,大于 2°.小于 等于 6°为Ⅱ级,大于 6°.小于等于 15°的为Ⅲ级,大于 1 ...

最新文章

  1. JS 时间转化为几分钟前 几小时前 几天前
  2. gradle拷贝静态资源文件_Gradle-操作文件文件拷贝
  3. 你愿意隐姓埋名一辈子吗?” #百年百人系列
  4. CSS布局:图片在DIV中上下左右居中(水平和垂直都居中)
  5. jenkins 构建异常_Jenkins多环境持续集成架构实践!
  6. android auto 墙纸,AA壁纸(Android Auto车载系统壁纸)
  7. 领域建模——事件风暴
  8. 使用python-docx模块解析docx文档
  9. AsyncTask我来给你扯会蛋
  10. 业务流程优化设计之思想和原则
  11. 一道疯狂bypass的题目
  12. python h5py 创建无限数据集、在无限数据集上添加新的数据
  13. 08s01 mysql_mysql报错 code:08S01,msg:SQLSTATE
  14. Flink事件时间和水印详解
  15. Excel if及ifs函数用法
  16. 水泵微型计算机辅助设计内容,基于CFD技术的脱硫浆液泵节能技术研究
  17. CHECK约束使用自定义函数
  18. 拿好你们的iPhone,听我讲故事
  19. 转载:详解Quartus导出网表文件:.qxp和.vqm
  20. 浙江大学计算机科学与技术学院导师,浙江大学计算机科学与技术专业导师介绍:徐从富...

热门文章

  1. RESTful之异常处理 Exceptions
  2. Pytorch中的序列化容器-度消失和梯度爆炸-nn.Sequential-nn.BatchNorm1d-nn.Dropout
  3. 2021-04-06 符号执行是啥?
  4. 干货|了解机器学习常用数据预处理
  5. 从词向量到Bert——简单作业题+讲解
  6. php读取不到指定的php.ini配置
  7. IntelliJ IDEA详细配置
  8. php简单的log文件
  9. Linux中mmap与munmap函数系统调用
  10. 行走在泰国的7天8夜(曼谷篇-汤姆吉普森故居·四面佛·美食篇)