题意:求一颗无向树的最小点覆盖。

本来一看是最小点覆盖,直接一下敲了二分图求最小割,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]);该节点选择了,那么子节点可选可不选。

2:dp[u][0]+=dp[v][1];该节点没有选择,则其子节点必需选择。

#include<iostream>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
using namespace std;
int n;
vector<vector<int> >v(100010);
int vis[100010];
int dp[100010][2];
inline int minn(int a,int b)
{
if(a<b)return a;
return b;
}
void dfs(int u)
{
dp[u][0]=0; //不放,0个
dp[u][1]=1; //放一个,
for(int i=0;i<v[u].size();i++)
{
int vv=v[u][i];
if(!vis[vv])
{
vis[vv]=1;
dfs(vv);
dp[u][0]+=dp[vv][1]; //回溯时加上
dp[u][1]+=minn(dp[vv][1],dp[vv][0]);
}
}
}
int main()
{
scanf("%d",&n);
int tx,ty;
for(int i=0;i<n-1;i++)
{
scanf("%d%d",&tx,&ty);
v[tx].push_back(ty);
v[ty].push_back(tx);
}
vis[1]=1;
dfs(1);
cout<<minn(dp[1][0],dp[1][1]); //结果为根放与不放的状态最小值
return 0;
}

666,求最优时候方案数,

多一个DP方程即可。

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n;
vector<vector<int> >v(100020);
int vis[100020];
struct state
{
int light;
int count;
};
state dp[100020][2];
inline int minn(int a,int b)
{
if(a<b)return a;
return b;
}
void dfs(int u)
{
dp[u][0].light=0; //不放,0个
dp[u][1].light=1; //放一个,
dp[u][0].count=dp[u][1].count=1;
for(int i=0;i<v[u].size();i++)
{
int vv=v[u][i];
if(!vis[vv])
{
vis[vv]=1;
dfs(vv);
dp[u][0].light+=dp[vv][1].light; //回溯时加上
dp[u][1].light+=minn(dp[vv][1].light,dp[vv][0].light); dp[u][0].count= dp[u][0].count*dp[vv][1].count%10007; if(dp[vv][1].light<dp[vv][0].light)
dp[u][1].count=dp[u][1].count*dp[vv][1].count%10007; else if (dp[vv][1].light>dp[vv][0].light)
dp[u][1].count=dp[u][1].count*dp[vv][0].count%10007; else
dp[u][1].count=dp[u][1].count*(dp[vv][0].count+dp[vv][1].count)%10007; }
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int tx,ty;
for(int i=0;i<=n;i++)
{
v[i].clear();vis[i]=0;
}
for(int i=0;i<n-1;i++)
{
scanf("%d%d",&tx,&ty);
v[tx].push_back(ty);
v[ty].push_back(tx);
}
vis[1]=1;
dfs(1);
int ans1=minn(dp[1][0].light,dp[1][1].light); //结果为根放与不放的状态最小值
if(dp[1][0].light<dp[1][1].light)
{
printf("%d %d\n",ans1,dp[1][0].count);
}
else if(dp[1][0].light>dp[1][1].light)
{
printf("%d %d\n",ans1,dp[1][1].count);
}
else
{
int ans2= (dp[1][0].count%10007+dp[1][1].count%10007)%10007;
printf("%d %d\n",ans1,ans2);
}
}
return 0;
}

SPOJ 1479 +SPOJ 666 无向树最小点覆盖 ,第二题要方案数,树形dp的更多相关文章

  1. Strategic game(无向?)二分图最小点覆盖(Poj1463,Uva1292)

    原题链接 此题求二分图的最小点覆盖,数值上等于该二分图的最大匹配.得知此结论可以将图染色,建有向图,然后跑匈牙利/网络流,如下.然而... #include<iostream> #incl ...

  2. UVALive 4329 树状数组第二题

    大白书上的题目,比较巧妙的是其分析,为了求某个i点做裁判的时候的情况数,只要知道左边有多少比它小的记为ansc,右边有多少比它小的记为ansd,则总种数,必定为 ansc*(右边总数-ansd)+an ...

  3. HDU 1054 Strategic Game(最小点覆盖+树形dp)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=106048#problem/B 题意:给出一些点相连,找出最小的点数覆盖所有的 ...

  4. HDU 1054 Strategic Game (最小点覆盖)【二分图匹配】

    <题目链接> 题目大意:鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时他无法找到解决方案,速度不够快,那么他很伤心.现在,他有以下的问题.他必须捍卫一个中世纪的城市,形成了树的道路.他把战士的 ...

  5. LA 2038 Strategic game(最小点覆盖,树形dp,二分匹配)

    题意即求一个最小顶点覆盖. 对于没有孤立点的图G=(V,E),最大独立集+最小顶点覆盖= V.(往最大独立集加点) 问题可以变成求树上的最大独立集合. 每个结点的选择和其父节点选不选有关, dp(u, ...

  6. 【BZOJ2286】消耗战(虚树,DFS序,树形DP)

    题意:一棵N个点的树上有若干个关键点,每条边有一个边权,现在要将这些关键点到1的路径全部切断,切断一条边的代价就是边权. 共有M组询问,每组询问有k[i]个关键点,对于每组询问求出完成任务的最小代价. ...

  7. nyoj 237 游戏高手的烦恼 二分匹配--最小点覆盖

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237 二分匹配--最小点覆盖模板题 Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只 ...

  8. POJ训练计划3041_Asteroids(二分图/最小点覆盖=最大匹配)

    解题报告 http://blog.csdn.net/juncoder/article/details/38135053 题目传送门 题意: 给出NxN的矩阵,有M个点是障碍 每次仅仅能删除一行或者一列 ...

  9. CodeCraft-19 and Codeforces Round #537 (Div. 2) E 虚树 + 树形dp(新坑)

    https://codeforces.com/contest/1111/problem/E 题意 一颗有n个点的树,有q个询问,每次从树挑出k个点,问将这k个点分成m组,需要保证在同一组中不存在一个点 ...

随机推荐

  1. Bootstrap 网格系统(Grid System)

    Bootstrap 网格系统(Grid System) Bootstrap提供了一套响应式,移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 什么是 ...

  2. Qt读写excel

    今天在利用Qt进行excel操作时,代码总是走到打开excel这一步是总是出现程序崩溃.在网上查找了各种帖子  说法不一,尝试都没有解决.后来猜想是不是excel没有激活影响的.发现自己的excel没 ...

  3. Shell脚本的条件测试与比较

    Shell脚本的条件测试与比较 一.shell脚本的条件测试 通常,在bash的各种条件结构和流程控制结构中都要进行各种测试,然后根据测试结构执行不同的操作,有时也会与if等条件语句相结合,来完成测试 ...

  4. (原)剑指offer之位运算

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示.   思路: count为1的位数,初始为零 每次右移一为,与1做与运算,结果不为零说明最后一位为1 c++代码如下   in ...

  5. django基础(web框架,http协议,django安装)

    学习Django之前我们先来看什么是OSI七层模型: 应用层 表示层       应用层(五层模型中把这三层合成一个应用层) http协议 会话层 传输层                  提供端口对 ...

  6. Hibernate 框架理解

    Hibernate框架简化了java应用程序与数据库交互的开发.Hibernate是一个开源,轻量级的ORM(对象关系映射)工具. ORM工具简化浏览数据的创建,数据处理和数据访问.它是将对象映射到数 ...

  7. 【14】PNG,GIF,JPG的区别及如何选

    [14]PNG,GIF,JPG的区别及如何选 GIF: 8位像素,256色 无损压缩 支持简单动画 支持boolean透明 适合简单动画 JPEG: 颜色限于256 有损压缩 可控制压缩质量 不支持透 ...

  8. 【29】html5新标签有哪些?

    [29]html5新标签有哪些? canvas svg video audio [01]article(IE8不支持) [01]details [02]aside(IE8不支持) [03]header ...

  9. 转:深入 AngularUI Router

    原文地址:http://www.ng-newsletter.com/posts/angular-ui-router.html ui-router: https://angular-ui.github. ...

  10. Windows同步阿里云时间

    Ctrl+R打开cmd命令框 输入:gpedit.msc 计算机配置”—“管理模版”—“系统”—“Windows 时间服务”—“时间提供程序”—“配置 Windows NTP 客户端 双击打开配置 W ...