SPOJ 1435 Vertex Cover 树形DP
i 表示节点 i ,j=0表示不选择其父节点,j=1表示选择其父节点。f 为其父节点。
取 每个节点选择/不选择 两者中较小的那个。
一组数据:
15
1 2
1 3
1 4
1 10
10 9
10 11
12 10
12 14
10 13
13 15
4 5
5 7
4 6
6 8
答案是6
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector> using namespace std; const int MAXN = ; vector<int> adj[MAXN];
bool vis[MAXN][];
int d[MAXN][];
int n, m;
//int path[MAXN][2];
//int fang[MAXN]; int dp( int i, int j, int f )
{
if ( vis[i][j] ) return d[i][j];
vis[i][j] = true;
int &ans = d[i][j]; ans = ;
for ( int k = ; k < (int)adj[i].size(); ++k )
if ( adj[i][k] != f ) ans += dp( adj[i][k], , i );
//path[i][j] = f; if ( j || f < )
{
int sum = ;
for ( int k = ; k < (int)adj[i].size(); ++k )
if ( adj[i][k] != f )
sum += dp( adj[i][k], , i );
if ( sum < ans )
{
ans = sum;
//path[i][j] = -f;
}
}
return ans;
} //void DFS( int i, int j, int f )
//{
// if ( fang[i] != -1 ) return;
// if ( !path[i][j] || path[i][j] == f )
// {
// if ( f >= 0 ) fang[f] = j;
// for ( int k = 0; k < (int)adj[i].size(); ++k )
// if ( adj[i][k] != f ) DFS( adj[i][k], 1, i );
// }
// else
// {
// if ( f >= 0 ) fang[f] = j;
// for ( int k = 0; k < (int)adj[i].size(); ++k )
// if ( adj[i][k] != f ) DFS( adj[i][k], 0, i );
//
// }
// return;
//} int main()
{
while ( ~scanf( "%d", &n ) )
{
m = n - ;
for ( int i = ; i <= n; ++i ) adj[i].clear(); for ( int i = ; i < m; ++i )
{
int a, b;
scanf( "%d%d", &a, &b );
adj[a].push_back(b);
adj[b].push_back(a);
} memset( vis, false, sizeof(vis) );
//memset( fang, -1, sizeof(fang) );
//memset( path, 0, sizeof(path) ); int ans = dp( , , - );
printf( "%d\n", ans );
}
return ;
}
SPOJ 1435 Vertex Cover 树形DP的更多相关文章
- SPOJ 1435 - Vertex Cover(树形DP,树的最小点覆盖)
算是个经典题目了,很模板的树形DP题目 做这个题的时候一开始就想到树形DP了,可是由于各种原因没写出来,代码太糟烂了,赛后还是改了好久才过的 dp(u,0)=sum(dp(v,1)): dp(u,1) ...
- SPOJ PT07X Vertex Cover
题目意思: 一棵树,找到最少的点能覆盖到所有的边,(也就是每条边俩端 至少有一个在你找到的集合): 解法:每条边只能被俩个点中的一个,或全部覆盖所以我们有树形DP来解: DP[num][flag]// ...
- 【BZOJ2616】SPOJ PERIODNI 笛卡尔树+树形DP
[BZOJ2616]SPOJ PERIODNI Description Input 第1行包括两个正整数N,K,表示了棋盘的列数和放的车数. 第2行包含N个正整数,表示了棋盘每列的高度. Output ...
- BZOJ2616 SPOJ PERIODNI(笛卡尔树+树形dp)
考虑建一棵小根堆笛卡尔树,即每次在当前区间中找到最小值,以最小值为界分割区间,由当前最小值所在位置向两边区间最小值所在位置连边,递归建树.那么该笛卡尔树中的一棵子树对应序列的一个连续区间,且根的权值是 ...
- SPOJ 1479 +SPOJ 666 无向树最小点覆盖 ,第二题要方案数,树形dp
题意:求一颗无向树的最小点覆盖. 本来一看是最小点覆盖,直接一下敲了二分图求最小割,TLE. 树形DP,叫的这么玄乎,本来是线性DP是线上往前\后推,而树形DP就是在树上,由叶子结点状态向根状态推. ...
- codeforces 709E E. Centroids(树形dp)
题目链接: E. Centroids time limit per test 4 seconds memory limit per test 512 megabytes input standard ...
- CF 461B Appleman and Tree 树形DP
Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...
- Codeforces Round #263 (Div. 2) D. Appleman and Tree(树形DP)
题目链接 D. Appleman and Tree time limit per test :2 seconds memory limit per test: 256 megabytes input ...
- HDU 3586.Information Disturbing 树形dp 叶子和根不联通的最小代价
Information Disturbing Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/ ...
随机推荐
- 【转载】mysql 四种隔离级别分析
sql标准中,有四种隔离级别,各个离级别都有各自的规则,隔离级别越低,允许并发越大,消耗的资源越少,但是越不安全,下面就mysql数据库来分别介绍一下(每个存储引擎实施的隔离级别会有稍微的不同)mys ...
- WPF-控件-ControlTemplate生成的控件
<Window x:Class="由ControlTemplate生成的控件.MainWindow" xmlns="http://schemas.microsoft ...
- ubuntu: 环境搭建
1.修改更新源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo gedit /etc/apt/sources.li ...
- 2016 系统设计第一期 (档案一)jQuery radio 取值赋值
MVC代码: <div class="form-group"> <label for="Gender" class="col-sm- ...
- Scene (场景视图) 详解
控制二维切换的按钮 点击2D按钮可以激活2D模式.这个按钮会将场景相机在透视视图和正交投影视图之间进行切换.当观察透视视图时,远离相机的物体看起来更小:然而,当正交投影视图的时候,物体的大小并不受相机 ...
- Serverless 架构:用服务代替服务器
Serverless 架构:用服务代替服务器 转载本文需注明出处:EAII企业架构创新研究院(微信号:eaworld),违者必究.如需 加入微信群参与微课堂.架构设计与讨论直播请直接回复此公众号:&q ...
- C++中的仿函数,std::function和bind()的用法
1.仿函数:又叫std::function,是C++中的一个模板类 2.C语言中的函数指针: int add(int a,int b) { return a+b; } typedef int (*f ...
- SQL Server 之 解锁
下图,制作了一个可以维持1分钟的表锁: 下图,可以查询出被锁的表,其中 spid 是锁定表的进程ID(也是 session_id): 可以通过 select connect_time from sys ...
- 浅谈Feature Scaling
浅谈Feature Scaling 定义:Feature scaling is a method used to standardize the range of independent variab ...
- uva 10128
动归 转移方程 :dp(i, j, k) = dp(i – 1, j, k) * (i – 2) + dp(i – 1, j – 1, k) + dp(i – 1, j, k – 1) i表示此时排第 ...