码迷,mamicode.com
首页 > 其他好文 > 详细

【图论】最小路径覆盖

时间:2021-01-06 12:12:01      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:多次   超级   mat   sum   二分   最大流   span   二分图   一个   

最小不相交路径覆盖:使用最小条数的路径,覆盖每个点恰好1次。
最小可相交路径覆盖:使用最小条数的路径,每个点可以覆盖多次。

最小可相交路径覆盖做一次Floyd传递闭包变成最小不相交路径覆盖。
最小不相交路径覆盖使用二分图匹配:把每个点x拆成x1(出度)和x2(入度),初始状态没有匹配,使用的路径数量是n(单个点也是一个路径),然后原图加的边会匹配一个出度和一个入度,然后向超级源点和超级汇点分别连权值为1的边,那么每个点的出度和入度必然是0或者1,这样求出最大流之后,用n减去最大流就是最小路径覆盖。

树的最小路径覆盖

使用树形dp解决,设 \(dp[u][0]\) 表示 u节点的子树中,u节点没有参与路径覆盖时的使用的最小条数的路径。 \(dp[u][1]\) 表示u节点的子树中,u节点参与路径覆盖时使用的最小条数的路径。

那么显然有

\(dp[u][0]=min(dp[u][0],\sum_{v\in ch[u]} dp[v][1] + 1)\) 表示这个点保留,不参加子树的路径,自己增加一个条数
\(dp[u][1]=min(dp[u][1],\sum_{v\in ch[u],v\neq v_0} dp[v][1] + dp[v_0][0])\) 表示这个点加入子树v0的路径。

问题的边界是叶子,叶子没有子树,扩充一下定义。
\(dp[u][0]=1\)
\(dp[u][1]=1\)

【图论】最小路径覆盖

标签:多次   超级   mat   sum   二分   最大流   span   二分图   一个   

原文地址:https://www.cnblogs.com/purinliang/p/14225530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!