狗家店面,只问了一道题,但是有follow up。
第一个问题很简单,就是一个无向向无环图求最长路径
第二个问题是第一个问题的follow up,如果有多个无向无环图,并且每一个图的最长路径已知。现在把这些图连起来,求连接起来的这个图的最长路径。
第三个问题:如果改成有向无环图呢?
补充内容 (2018-10-24 12:01):
无向无环图,打错了
补充内容 (2018-10-24 21:11):
第二问是指对于两个图,各取一点,然后把这两点连接,就相当于把这两个图连接了起来。
狗家店面,只问了一道题,但是有follow up。
第一个问题很简单,就是一个无向向无环图求最长路径
第二个问题是第一个问题的follow up,如果有多个无向无环图,并且每一个图的最长路径已知。现在把这些图连起来,求连接起来的这个图的最长路径。
第三个问题:如果改成有向无环图呢?
补充内容 (2018-10-24 12:01):
无向无环图,打错了
补充内容 (2018-10-24 21:11):
第二问是指对于两个图,各取一点,然后把这两点连接,就相当于把这两个图连接了起来。
第三问在有向无环图(DAG)中求最长路径(又叫做关键路径,critical path)是一个经典问题,做法是拓扑排序+动态规划
首先对原图做一些处理:
(1) 每条边权值(weight)设为1
(2) 考虑到题目中起点和终点不固定,不妨设原图的源点集合(即入度为0的点)为S,汇点集合(即出度为0的点)为T;然后添加额外的两个点s和t,并从s连一条权值为0的边到S中每个点,从T中每个点连一条权值为0的边到t
现在求s到t的关键路径即可,可以参考下面一些链接里的介绍:
无向无环图中的最长路径也是比较经典的问题:
1.无向无环图=树,任取一点味根,对树做dfs,递归地返回每个子树的根到叶子的最长路径值,并通过这个信息维护最长路径,如 L 为左子树的返回值, R为右子树返回值,则用L+R+1更新最长路,并返回max(L,R)+1。
2.连接是啥子意思哦····
3.每次找入度为0的点开始做dfs,直到没有入度为0的点为止,维护最长路值
请问第二第三问怎么答?
第一個問題是不是類似哩叩五四三
題目是要印出最長的路徑,還是找出最長路徑的值就好?
但這棵樹不一定是 binary tree 吧? 所以光是用 L 和 R 應該不夠
是的,那就维护Len1+Len2+1, 返回max(len)+1,len1 len2 是最长的两个子树的返回值。
第二问是指对于两个图,各取一点,然后把这两点连接,就相当于把这两个图连接了起来。
第二问,如果只有两个图的话,如图a和图b,可以先求出从连接的那个点在这个图a的最长路径,记为len_a, 同理找出len_b。找出图a和图b的最长路径,记为max_a, max_b。则最长路径为max(max_a, max_b, len_a+len_b). 但是k个图的没想出来,k>2.
补充内容 (2018-10-24 21:26):
应该是max(max_a, max_b, len_a+len_b+1),因为这两个点用一根额外的线连接起来