动态规划中的多段图问题
多段图的最短路径问题:只有相邻的节点之间有联系
多段图的定义:
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
动态规划中的多段图问题相关推荐
- 多段图的动态规划算法(C/C++)
1. 实验环境 (1)Visual Studio 2019(32位调试器) (2)Windows 10 2. 多段图描述 多段图G = (V,E)是一个带权有向图,它具有以下特性: 图中的节点被划分成 ...
- 动态规划多段图和货郎担问题
一.实验目的 1.掌握能用动态规划方法求解的问题应满足的条件: 2.加深对动态规划方法的理解与应用: 3.锻炼学生对程序跟踪调试能力: 4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力. ...
- 算法-动态规划2图问题-多段图的最短路径问题
算法-动态规划2-多段图的最短路径问题 多段图的最短路径问题 问题:设图G=(V,E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i< ...
- 动态规划——多段图问题
多段图问题 多段图问题是利用动态规划思想解决的经典问题之一,在日常生活中应用广泛. 问题描述 若存在一个有向加权图G,且G能分出起点和终点以及中间的n的阶段,求起点到终点的最短(长)距离. 分析设计 ...
- 怎样把视频中的一小段制作成 GIF动图
平常生活中大家聊天肯定会发现有很多斗图高手,不管是家人群.同学群还是好友群,从不缺乏这样的人,大多数用来斗图的图片都是GIF动图,GIF动图即有趣又形象,像小视频一样,只不过它是图片格式.大家对GIF ...
- 动态规划求解多段图问题
动态规划求解多段图问题(非递归) 问题描述 求解思路 动态规划逆序解法 逆序实现代码 动态规划逆序解法 顺序实现代码 问题描述 如图所示,在A处有一水库,现需要从A点铺设一条管道到E点,边上的数字表示 ...
- 动态规划求解多段图最短路径
动态规划求解多段图最短路径 题目: 分析见源代码注释 源代码: #include<stdio.h> #define N 10//定义定点数,编号从1开始 #define M 5//定义层数 ...
- FigDraw 20. SCI文章中绘图之马赛克图 (mosaic)
点击关注,桓峰基因 桓峰基因公众号推出基于R语言绘图教程并配有视频在线教程,目前整理出来的教程目录如下: FigDraw 1. SCI 文章的灵魂 之 简约优雅的图表配色 FigDraw 2. SCI ...
- arcgis中制作出行od图_arcgis制作坡度图
坡度图制作方法 坡度图制作方法 1 坡度分级标准 按照耕地坡度分级的要求,对耕地坡度分为五级,即小于等于 2°为Ⅰ级,大于 2°.小于 等于 6°为Ⅱ级,大于 6°.小于等于 15°的为Ⅲ级,大于 1 ...
最新文章
- JS 时间转化为几分钟前 几小时前 几天前
- gradle拷贝静态资源文件_Gradle-操作文件文件拷贝
- 你愿意隐姓埋名一辈子吗?” #百年百人系列
- CSS布局:图片在DIV中上下左右居中(水平和垂直都居中)
- jenkins 构建异常_Jenkins多环境持续集成架构实践!
- android auto 墙纸,AA壁纸(Android Auto车载系统壁纸)
- 领域建模——事件风暴
- 使用python-docx模块解析docx文档
- AsyncTask我来给你扯会蛋
- 业务流程优化设计之思想和原则
- 一道疯狂bypass的题目
- python h5py 创建无限数据集、在无限数据集上添加新的数据
- 08s01 mysql_mysql报错 code:08S01,msg:SQLSTATE
- Flink事件时间和水印详解
- Excel if及ifs函数用法
- 水泵微型计算机辅助设计内容,基于CFD技术的脱硫浆液泵节能技术研究
- CHECK约束使用自定义函数
- 拿好你们的iPhone,听我讲故事
- 转载:详解Quartus导出网表文件:.qxp和.vqm
- 浙江大学计算机科学与技术学院导师,浙江大学计算机科学与技术专业导师介绍:徐从富...
热门文章
- RESTful之异常处理 Exceptions
- Pytorch中的序列化容器-度消失和梯度爆炸-nn.Sequential-nn.BatchNorm1d-nn.Dropout
- 2021-04-06 符号执行是啥?
- 干货|了解机器学习常用数据预处理
- 从词向量到Bert——简单作业题+讲解
- php读取不到指定的php.ini配置
- IntelliJ IDEA详细配置
- php简单的log文件
- Linux中mmap与munmap函数系统调用
- 行走在泰国的7天8夜(曼谷篇-汤姆吉普森故居·四面佛·美食篇)