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最长路(最短路)相关推荐

  1. POJ - 3160 Father Christmas flymouse DAG最长路

    又来做这一道缩点的裸题,发现图转化为DAG后明显是一个最长路,那么有没有固定都求法呢,查询资料后发现的确是一种固定的做法. DAG最长路,分为两种固定终点和不固定终点. 令dp[i]表示从i顶点出发能 ...

  2. 【EOJ Monthly 2019.02 - E】中位数(二分 ,中位数 ,−1/1变换,dp求解DAG最长路)

    题干: E. 中位数 单测试点时限: 10.0 秒 内存限制: 256 MB "你的地图是一张白纸,所以即使想决定目的地,也不知道路在哪里." QQ 小方最近在自学图论.他突然想出 ...

  3. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索

    题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...

  4. 【POJ - 3160】Father Christmas flymouse(Tarjan缩点,DAG最长路)

    题干: After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends s ...

  5. 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题Skiing(拓扑序求DAG最长路)

    题意: 给定一个有向无环图,求该图的最长路. 思路: 由于是有向无环图,所以最长路肯定是一个入度为0到出度为0的路径,拓扑序在确定当前点之前能够考虑到所有到它的情况,所以最后取个最值即可. 代码: # ...

  6. 11.6 DAG最长路

    DAG:有向无环图 1.求整个DAG中的最长路径(即:不固定终点和起点) 2.固定终点,求DAG中的最长路径 问题1 给定一个有向无环图,如何求解整个图的所有路径中权值之和最大的那条 令:dp[i]表 ...

  7. DAG最长路问题 hdu-1224

    用DFS+记忆化写了一下,拓扑排序+DP的我还没弄明白.据说Codeforces 721C就是这类题目,因为有费用限制,DFS不太好写,有时间把DP法想明白来. #include <iostre ...

  8. 硬币问题——固定终点的最长路和最短路

    问题描述: 有n种硬币,面值分别为V1,V2...,Vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值.0 <= n <= 100 ...

  9. 图论 —— DAG 图的最长路

    [概述] DAG 图的最长路问题是一个比较少见的问题,具体问题是:给出一个 DAG 图,寻找图中的最长路 在 AOE 网中,在找出关键路径后,对其进行 DFS 即可得到图的最长路,由于这种方法的实现过 ...

最新文章

  1. APP多版本共存,服务端如何兼容?
  2. Web安全学习笔记之HTTP协议
  3. SDM450+android8.1播放左声道音频文件和右声道音频文件,左右喇叭都有声音问题
  4. openstack数据库获取一个虚机的floating_ip, fix_ip, project_name, user_name, hostname, host
  5. Cookies和Session(三)--SessionState
  6. (32)FPGA面试题时序约束
  7. 从人与世界的关系上来看,人其实分为两部分
  8. iOS 开发面试通关指南:67 个必知问题!
  9. CentOS搭建SVN记录
  10. python基础学习笔记1
  11. 国际冠码与国际电话区号
  12. nar-gab投稿记录
  13. Java---SSM---Spring(1)
  14. 【5G NAS】5G SUPI 和 SUCI 标识符详解
  15. 生活污水处理设备让污水无处躲藏
  16. 2022/05/26 css animate按钮样式收集
  17. 怎么将abaqus的数据导出_abaqus系列之二维图形导出
  18. LeakCanary2.5版本使用
  19. 死锁问题的出现和解决
  20. java rsa 公钥格式_JAVA,NET RSA密钥格式转换

热门文章

  1. 2020年全国大学生数学建模竞赛喜提国二
  2. UVa 496 Simply Subsets (STLset_intersection)
  3. Python的应用(一)
  4. android U盘 io异常,win10系统打开u盘提示由于io设备错误的解决方法
  5. 一例ASP.net 网站‘此网页包含重定向循环’解决方法
  6. 学习Java-JavaSE的必备工具(内附各种工具的下载链接)
  7. Selenium中implicitly_wait等待失效
  8. Jetson nano 树莓派 传输视频帧直播 极低延迟
  9. 近年来世界各地ICO的花式骗局盘点
  10. iNFTnews|FTX一夜崩塌,但Web3仍前途光明