9.3.1多阶段决策问题 - 多段图的最短路

例题 9-4 单向TSP(Unidirectional TSP,UVa116)

VJ传送门:https://cn.vjudge.net/problem/UVA-116

描述:

给定一个m行n列的矩阵(m <= 10, n <= 100),要求从第1列的任何一行出发,每次沿右或右下或右上到达后面一列,最后到第m列任何一行,使经过的整数之和最小,整个矩阵是环形的,即第一行的上一行是最后一行,最后一行的下一行是第一行。多解时输出字典序最小的。

分析:

在这个题目中,每一列就是一个阶段,每个阶段都有3种决策:直行、右上和右下。

状态定义:d(i,j)为从格子(i,j)出发到最后一列的最小开销。

题目要求输出字典序最小的解,则需要在计算d(i,j)的同时记录下下一列最小的行号(在满足最优性的前提下)。

代码:

原文地址:https://www.cnblogs.com/DrCharlie/p/Ex9_4-UVa116.html

时间: 2024-08-29 10:57:31

9.3.1多阶段决策问题 - 多段图的最短路的相关文章

UVa 116 (多段图的最短路) Unidirectional TSP

题意: 有一个m行n列的正整数环形矩阵(即矩阵第一行的上一行是最后一行,最后一行的下一行是第一行),从第一列的任意位置出发,每次只能向右,右上,右下三个方向行走,输出路径及路径上所有数之和的最大值,多解时输出最小字典序的解. 分析: 这道题有点像数塔的变形,不同的是从三角形变成了矩形.依然是从最后一列往前递推.Next数组时用来记录路径的,first是最优解的第一列的行号.代码中将下一行的三个拓展出的行号排序来保证字典序最小. 1 #include <cstdio> 2 #include &l

Unidirectional TSP UVA - 116 多段图的最短路

题目:题目链接 思路:从后往前进行dp,用next数组记录字典序最小的那一条路径 AC代码: #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <vector> #include <set> #include <map> #include <uno

多段图动态规划dp

多段图问题是DP的基础题目.大体的意思是有一个赋权有向图,其顶点集被分为几个子集.求经过每个子集从源点到终点的最短路径 1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.Scanner; 4 import java.util.Stack; 5 6 public class Main { 7 private static final int k = 3; 8 private static int[

多段图

多段图问题是求由s到t的最小成本路径. 图中的结点被划分成 k≥ 2个不相交的集合Vi , 1≤i≤k,其中V1和Vk分别只有一个结点 s (源点) 和t ( 汇点). 多段图向前处理的算法 1.算法执行过程 COST[j]=c(j,r)+COST[r]; 第4段            COST(4,9) = c(9,12) = 4 COST(4,10) = c(10,12) = 2 COST(4,11) = c(11,12) = 5 第3段            COST(3,6) = min

动态规划作业-多段图的最短路径问题

多段图的最短路径问题 问题:设图G=(V,E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i<=k), 使得E中的任何一条边<u,v>,必有u∈Vi, v∈Vi+m(1<=i<k,1<i+m<=k),则称图G为多段图,称s∈V1为源点, t∈Vk为终点. 多段图的最短路径问题为从源点到终点的最小代价路径. 子问题:设Cuv表示多段图的有向边<u,v>上的权值,将从源点s到终点t的最短路径长度即

hdu 4885 (n^2*log(n)判断三点共线建图)+最短路

题意:车从起点出发,每次只能行驶L长度,必需加油到满,每次只能去加油站或目的地方向,路过加油站就必需进去加油,问最小要路过几次加油站. 开始时候直接建图,在范围内就有边1.跑最短了,再读题后发现,若几个点共线,且都在范围内,那么中间有点的俩头的点就不能有边,否则与条件相悖.关键是怎么用n^2*logn,的复杂度判断三点共线:点先按X排序,考察每个点i时候,第二个点j,若直线ij斜率已经存在,则不能添加了,查找是否存在,用容器就行(map\set)都是logn的,所以满足要求.之后最短路即可. #

uva 116 Unidirectional TSP(动态规划,多段图上的最短路)

这道题目并不是很难理解,题目大意就是求从第一列到最后一列的一个字典序最小的最短路,要求不仅输出最短路长度,还要输出字典序最小的路径. 这道题可以利用动态规划求解.状态定义为: cost[i][j] = max{cost[i+1][j+k]+c[i][j]}(k=-1,0,1) 关于最短路长度的求法,我们可以通过上边的状态转移方程递推求解.cost代表从第i列到第c-1列的最短路,只要找出cost[0][j](j代表行号)中的最大值,我们得到的结果就是最短路. 我们已经得到了最短路的长度.下一步,

dijkstra 算法 找图的最短路 单源最短路

基本思路是    一个path数组存路径  一个distance数组存距离   distance[k]表示 k结点到指定的初始结点的最短路   还要个collect数组收集已经被操作过的点 先初始化distance 把目标结点的子结点的距离放进去,其他的初始化为无穷大,  每次找d中未被收集到collection中的最小值,这是最重要的,有这步才能证明最后得到的是最短路,这步是贪心思想,每次找距离最小的未在collection里的结点来,保证最后得到的最小路径,这是被证明的,这步也保证了遍历所有

图的最短路算法 Floyd

多源最短路径算法 时间复杂度O(N3) 简单修改可求有向图的传递闭包 #include<iostream> using namespace std; const int maxn=1024; const int inf=1<<30; int d[maxn][maxn]; int n,m; void init() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=(i==j?0:inf); } int main()