DAG最长路(最短路)
DAG就是有向无环图。
DAG上的最长或者最短路是很重要的一类问题。很多问题都可以转化为DAG上的最长或者最短路径的问题。DAG求最短和最长路的方法一样。
本算法主要解决2个问题
1)求整个DAG中的最长路径(即不固定起点,也不固定终点)
2)固定终点,求DAG的最长路径。
1)求整个DAG中的最长路径(即不固定起点,也不固定终点)
dp【i】表示从 i 号顶点出发能获得的最长路径的长度
int DP(int i){if(dp[i] > 0){return dp[i];}for(int j = 0; j < n; j++){if(G[i][j] != INF){dp[i] = max(dp[i], DP(j) + G[i][j]); //状态方程}}return dp[i];
}
入度为0的顶点出发最长路径长度就0,这就递归边界。
但是我们实际写的时候不妨对整个dp数组进行初始化为0,这样当dp函数访问的顶点i的出度为0的时候就会返回值0.(以此作为递归边界)。而出度不为0的就会自动递归求解。递归过程中,遇到已经计算过的顶点则直接返回对应的dp值,于是从程序逻辑上按照逆拓扑排序进行。
求路径
int DP(int i){if(dp[i] > 0) return dp[i];for(int j = 0; j < n; j++){if(G[i][j] != INF){int temp = DP(j) + G[i][j]; //单独计算以防调用Dp函数2次。 if(temp > dp[i]){dp[i] = temp;choice[i] = j; //j是i的后继 }}return dp[i];}
}void printPath(int i){printf("%d", i);while(choice[i] != -1){i = choice[i];printf("->%d", i);}
}
如果有多条路径开个vector数组即可,并且 这个是自动按字典序最小输出的。因为你循环的时候是从小到大循环找路径的。
至此,零dp【i】 表示从i 顶点出发的最长路径已经求出来了。那么以i顶点结尾的最长路径长度怎么求呢?
2)固定终点,求DAG的最长路径。
可以想象只要把求解公式变一下就可以了
dp[i] = max(dp[j] + G[j][i]);
求解顺序变为拓扑排序
但是却不能直接得到字典序求出。
上面讨论的基础上,我们来讨论第二个问题,固定终点,求DAG的最长路径长度。假设终点为T,令dp【i】表示从i好顶点出发到达终点T能获得的最长路径长度。
那这与第一个有什么不同呢?
没错就是边界,第一求得边界是出度为0的点,dp值也为0,这个是求T点的DP值。
那么dp【T】 = 0
那么我们能不能还把其他的dp位置还设置为0呢?显然不行,因为由于冲没写顶点出发可能无法到达终点T,如果dp还是初始化为0那么就会得到错误的结果,我们应该初始化为-INF,如果是 +INF 会带来麻烦的(因为我们求的最长路)求最短路反之。
然后我们需要设置一个vis数组,表示这个顶点是否访问过
int DP(int i){if(vis[i]) return dp[i];vis[i] = true;for(int j = 0; j < n; j++){if( G[i][j] != INF){int temp = max (dp[i], DP(j) + G[i][j]);dp[i] = temp;}} return dp[i];
}
矩形嵌套问题:
最短路
DAG最长路(最短路)相关推荐
- POJ - 3160 Father Christmas flymouse DAG最长路
又来做这一道缩点的裸题,发现图转化为DAG后明显是一个最长路,那么有没有固定都求法呢,查询资料后发现的确是一种固定的做法. DAG最长路,分为两种固定终点和不固定终点. 令dp[i]表示从i顶点出发能 ...
- 【EOJ Monthly 2019.02 - E】中位数(二分 ,中位数 ,−1/1变换,dp求解DAG最长路)
题干: E. 中位数 单测试点时限: 10.0 秒 内存限制: 256 MB "你的地图是一张白纸,所以即使想决定目的地,也不知道路在哪里." QQ 小方最近在自学图论.他突然想出 ...
- UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...
- 【POJ - 3160】Father Christmas flymouse(Tarjan缩点,DAG最长路)
题干: After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends s ...
- 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题Skiing(拓扑序求DAG最长路)
题意: 给定一个有向无环图,求该图的最长路. 思路: 由于是有向无环图,所以最长路肯定是一个入度为0到出度为0的路径,拓扑序在确定当前点之前能够考虑到所有到它的情况,所以最后取个最值即可. 代码: # ...
- 11.6 DAG最长路
DAG:有向无环图 1.求整个DAG中的最长路径(即:不固定终点和起点) 2.固定终点,求DAG中的最长路径 问题1 给定一个有向无环图,如何求解整个图的所有路径中权值之和最大的那条 令:dp[i]表 ...
- DAG最长路问题 hdu-1224
用DFS+记忆化写了一下,拓扑排序+DP的我还没弄明白.据说Codeforces 721C就是这类题目,因为有费用限制,DFS不太好写,有时间把DP法想明白来. #include <iostre ...
- 硬币问题——固定终点的最长路和最短路
问题描述: 有n种硬币,面值分别为V1,V2...,Vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值.0 <= n <= 100 ...
- 图论 —— DAG 图的最长路
[概述] DAG 图的最长路问题是一个比较少见的问题,具体问题是:给出一个 DAG 图,寻找图中的最长路 在 AOE 网中,在找出关键路径后,对其进行 DFS 即可得到图的最长路,由于这种方法的实现过 ...
最新文章
- APP多版本共存,服务端如何兼容?
- Web安全学习笔记之HTTP协议
- SDM450+android8.1播放左声道音频文件和右声道音频文件,左右喇叭都有声音问题
- openstack数据库获取一个虚机的floating_ip, fix_ip, project_name, user_name, hostname, host
- Cookies和Session(三)--SessionState
- (32)FPGA面试题时序约束
- 从人与世界的关系上来看,人其实分为两部分
- iOS 开发面试通关指南:67 个必知问题!
- CentOS搭建SVN记录
- python基础学习笔记1
- 国际冠码与国际电话区号
- nar-gab投稿记录
- Java---SSM---Spring(1)
- 【5G NAS】5G SUPI 和 SUCI 标识符详解
- 生活污水处理设备让污水无处躲藏
- 2022/05/26 css animate按钮样式收集
- 怎么将abaqus的数据导出_abaqus系列之二维图形导出
- LeakCanary2.5版本使用
- 死锁问题的出现和解决
- java rsa 公钥格式_JAVA,NET RSA密钥格式转换
热门文章
- 2020年全国大学生数学建模竞赛喜提国二
- UVa 496 Simply Subsets (STLset_intersection)
- Python的应用(一)
- android U盘 io异常,win10系统打开u盘提示由于io设备错误的解决方法
- 一例ASP.net 网站‘此网页包含重定向循环’解决方法
- 学习Java-JavaSE的必备工具(内附各种工具的下载链接)
- Selenium中implicitly_wait等待失效
- Jetson nano 树莓派 传输视频帧直播 极低延迟
- 近年来世界各地ICO的花式骗局盘点
- iNFTnews|FTX一夜崩塌,但Web3仍前途光明