题意:求一颗无向树的最小点覆盖. 本来一看是最小点覆盖,直接一下敲了二分图求最小割,TLE. 树形DP,叫的这么玄乎,本来是线性DP是线上往前\后推,而树形DP就是在树上,由叶子结点状态向根状态推. dp[u][1/0]:表示,结点u,1:选择,0,:不选.dp值是以改点为根(目前为止,dfs遍历顺序自然决定了树的层)的已经选择点数,自然开始时不知道,对每个点,初值dp[u][0]=0. dp[u][1]=1,回溯的时候: 1:dp[u][1]+=min(dp[v][1],dp[v][0]);该…
原题链接 此题求二分图的最小点覆盖,数值上等于该二分图的最大匹配.得知此结论可以将图染色,建有向图,然后跑匈牙利/网络流,如下.然而... #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN=2000+5; int q[MAXN],hd1[MAXN],hd2[MAXN]; int lnk[MAXN]; bool vis[MAXN],bw[MAX…
大白书上的题目,比较巧妙的是其分析,为了求某个i点做裁判的时候的情况数,只要知道左边有多少比它小的记为ansc,右边有多少比它小的记为ansd,则总种数,必定为 ansc*(右边总数-ansd)+ansd*(左边总数-ansc). 为了速度求出ansc和ansd,用到树状数组,这倒不是很难得地方,每次读到a[i],更新a[i]值+1即可.反过来求一次即可求出来 ansd 注意最后数据可能超过32位整数,因此用long long 树状数组的使用还有些不熟练...要继续加强 #include <io…
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=106048#problem/B 题意:给出一些点相连,找出最小的点数覆盖所有的 用树形dp来解决 dp[i][0]表示i点不选,dp[i][1]表示i点选,dp[i][0] = sum{ dp[ son[i] ][1] }, // i不选,则i的子节点全选, dp[i][1] = sum { min( dp[ son[i] ][0], dp[ son[i] ][1] ) } +…
<题目链接> 题目大意:鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时他无法找到解决方案,速度不够快,那么他很伤心.现在,他有以下的问题.他必须捍卫一个中世纪的城市,形成了树的道路.他把战士的最低数量的节点上,使他们可以观察所有的边.你能帮助他吗?士兵,鲍勃把一个给定的树,你的程序应该发现的最小数目. 解题分析: 最小点覆盖模板题,用最少的点来覆盖所有的边.建立无向图,然后求出其最大匹配,最小点覆盖数=最大匹配数.需要注意的是,本题用邻接矩阵存图跑匈牙利会T,所以用链式前向星存图. #includ…
题意即求一个最小顶点覆盖. 对于没有孤立点的图G=(V,E),最大独立集+最小顶点覆盖= V.(往最大独立集加点) 问题可以变成求树上的最大独立集合. 每个结点的选择和其父节点选不选有关, dp(u,1)表示父节点选,这时u不可选, dp(u,0)表示父节点不选,这时u可选可不选. #include<bits/stdc++.h> using namespace std; ; ]; ], clk; ],to[maxn<<],ec; void add(int u,int v) { to…
题意:一棵N个点的树上有若干个关键点,每条边有一个边权,现在要将这些关键点到1的路径全部切断,切断一条边的代价就是边权. 共有M组询问,每组询问有k[i]个关键点,对于每组询问求出完成任务的最小代价. 对于100%的数据,2<=n<=250000,m>=1,sigma(ki)<=500000,1<=ki<=n-1 思路:第一题虚树,需要详细地记录一下. 对于此题,朴素的树形DP很好理解: dp[u]为将u子树中的关键点全部切断的最小代价 dp[u]=min(cut[u]…
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237 二分匹配--最小点覆盖模板题 Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只有vector<>过了! 代码如下: //最小点覆盖 = 最大匹配数 //最大独立集 = N - 最大匹配数 #include "stdio.h" //二分匹配,求最小点覆盖 #include "string.h" #include "vector…
解题报告 http://blog.csdn.net/juncoder/article/details/38135053 题目传送门 题意: 给出NxN的矩阵,有M个点是障碍 每次仅仅能删除一行或者一列,最少删除多少次才干清除障碍 思路: 把行和列看作两个集合结点.把障碍看作集合结点的连线.这样就转化成求用最少的点来消灭边.也就是最小点覆盖. 在二分图中:(n个结点,且没有孤立的点) 最小点覆盖=最大匹配 最大点独立=结点数-最大匹配 #include <queue> #include <…
https://codeforces.com/contest/1111/problem/E 题意 一颗有n个点的树,有q个询问,每次从树挑出k个点,问将这k个点分成m组,需要保证在同一组中不存在一个点是另一个点的祖先这种情况,问有多少中分组方案 题解 首先解决转移问题,假设一次询问全颗树的分组方案数,定义dp[u][i]为到树节点u,分了i组的方案数,其中num(fa[u])为u的祖先节点个数 \(dp[u][i]=dp[fa][i]*(i-num(fa[u]))+dp[fa][i-1]\) 当…