求一棵树的最小路径覆盖

相关题目:http://codeforces.com/problemset/problem/618/D

有向图的最小路径覆盖(所有点)可以用二分图来解,n-最大匹配。

无向图的最小路径覆盖(所有点)似乎是比较困难的问题

那么对于特殊的无向图 - ‘树‘来说,求它的最小路径覆盖有什么好用的方法呢?

首先我们可以考虑用dp求解,维护每棵子树留下向上可延伸路径的情况下能获得的最小路径覆盖是多少f[i][1],以及每棵子树不留下向上可延伸路径的情况下能获得的最小路径覆盖f[i][0]。转移在这里不多赘述,但是有一点是显而易见的,对于每个点i,f[i][0]≥f[i][1]。而这一点恰好可以给我们一点新的想法,是否可以每个点尽量“不留后路”,也就是说能“能拐下去则拐下去”?答案是肯定的。

首先应明确一点,求最小路径覆盖,也就是使路径覆盖尽量多的边。

我们对于每个点,找到它孩子中“可延伸”的个数tot,如果tot=0,那么这个点只能成为“可延伸”点,如果tot=1,那么这唯一一条由儿子延伸上来的边一定要加入答案U的,同时当前这个点也成为了“可延伸”点,如果tot≥2那么这个点可以合任意两个儿子延伸上来的边“为一”,将两条边加入答案U,这样路径数无形中减了1,这也验证了贪心的正确性,因为如果不合二为一的话,此时答案不会更优,那么继续往上延伸后的结果最好也就是-1,早减晚减都一样,还不如早减,免得“过了这村没这店”了。

最后DFS结束,得到了答案U,答案U实际上是最多覆盖多少条边。那么最小路径也就是n-U了。

void Dfs(int x, int fa)
{
    int ed = last[x], dr;
    int tot = 0;
    while (ed != -1) {
        dr = other[ed];
        if (dr != fa) {
            Dfs(dr, x);
            if (flag[dr]) tot++;
        }
        ed = pre[ed];
    }
    if (tot == 0) flag[x] = true;
        else if (tot == 1) cnt++, flag[x] = true;
            else cnt += 2LL, flag[x] = false;
}

时间: 2024-10-27 02:48:36

求一棵树的最小路径覆盖的相关文章

Codeforces 618D Hamiltonian Spanning Tree(树的最小路径覆盖)

题意:给出一张完全图,所有的边的边权都是 y,现在给出图的一个生成树,将生成树上的边的边权改为 x,求一条距离最短的哈密顿路径. 先考虑x>=y的情况,那么应该尽量不走生成树上的边,如果生成树上有一个点的度数是n-1,那么必然需要走一条生成树上的边,此时答案为x+y*(n-2). 否则可以不走生成树上的边,则答案为y*(n-1). 再考虑x<y的情况,那么应该尽量走生成树上的边,由于树上没有环,于是我们每一次需要走树的一条路,然后需要从非生成树上的边跳到树的另一个点上去, 显然跳的越少越好,于

SPOJ UOFTCG - Office Mates (树的最小路径覆盖)

UOFTCG - Office Mates no tags Dr. Baws has an interesting problem. His N graduate students, while friendly with some select people, are generally not friendly with each other. No graduate student is willing to sit beside a person they aren't friends

UVAlive 7368 Airports(建图+最小路径覆盖)

题目地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5390 思路:先将每个点之间的最短路求出,将每条路径抽象为点,每架飞机抽象为边(对于两条路径(i,j)若飞机能在规定时间内从i到达j,则连边).则该问题转化为用最少的边覆盖全部的点,即为最小路径覆盖.新形成的图为DAG(同样是二分图),求最大匹配数.则最小路径覆盖为节

poj 2060 Taxi Cab Scheme(DAG图的最小路径覆盖)

题意: 出租车公司有M个订单. 订单格式:     hh:mm  a  b  c  d 含义:在hh:mm这个时刻客人将从(a,b)这个位置出发,他(她)要去(c,d)这个位置. 规定1:从(a,b)到(c,d)所花的时间为:abs(a-c)+abs(b-d). 规定2:一辆出租车如果要接单,必须在客人出发前1分钟(包括)以前接单. 问,最少派出多少辆出租车,可以完成所有任务. 思路: 把每一笔单看成一个点,如果完成第i个单后可以接到第j个单,则 i->j连上线. 则题为:求这个DAG图的最小路

最小路径覆盖问题

byvoid好神啊Orz 摘自byvoid的题解 [问题分析] 有向无环图最小路径覆盖,可以转化成二分图最大匹配问题,从而用最大流解决. [建模方法] 构造二分图,把原图每个顶点i拆分成二分图X,Y集合中的两个顶点Xi和Yi.对于原图中存在的每条边(i,j),在二分图中连接边(Xi,Yj).然后把二分图最大匹配模型转化为网络流模型,求网络最大流. 最小路径覆盖的条数,就是原图顶点数,减去二分图最大匹配数.沿着匹配边查找,就是一个路径上的点,输出所有路径即可. [建模分析] 对于一个路径覆盖,有如

(hdu step 6.3.3)Air Raid(最小路径覆盖:求用最少边把全部的顶点都覆盖)

题目: Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 124 Accepted Submission(s): 102   Problem Description Consider a town where all the streets are one-way and each street leads from one

(hdu step 6.3.3)Air Raid(最小路径覆盖:求用最少边把所有的顶点都覆盖)

题目: Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 124 Accepted Submission(s): 102   Problem Description Consider a town where all the streets are one-way and each street leads from one

hiho 第118周 网络流四&#183;最小路径覆盖

描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接.在一个景点游览完后,可以顺着游览线路前往下一个景点. 为了避免游客重复游览同一个景点,游览线路保证是没有环路的. 每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回.每个景点只会有一个调查团经过,不会重复调查. 举个例子: 上图中一共派出了3个调查团: 1

COGS728. [网络流24题] 最小路径覆盖问题

算法实现题8-3 最小路径覆盖问题(习题8-13) ´问题描述: 给定有向图G=(V,E).设P是G的一个简单路(顶点不相交)的集合.如果V中每个顶点恰好在P的一条路上,则称P是G的一个路径覆盖.P中路径可以从V的任何一个顶点开始,长度也是任意的,特别地,可以为0.G的最小路径覆盖是G的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图G的最小路径覆盖. 提示: 设V={1,2,...  ,n},构造网络G1=(V1,E1)如下: 每条边的容量均为1.求网络G1的(x0,y0)最大流.