POJ1848--Tree ——树形dp
题意:给你一个树,问你最少连几条边可以让树中的每一个节点在且只在一个环内。如果无法完成就输出-1。
我们设dp[i][0]为根节点为i的树变成每一个节点都在且只在一个环里所需要的最小边数。dp[i][1]为除了根节点i外其他点都在且只在一个环里所需要的最小边数。
dp[i][2]为除了根节点和一个子节点(以及子节点可有可无的链)都在且只在一个环里所需要的最小边数。
这样我们的状态转移需要考虑以下4种情况:
(第一张图最上面应该是dp[i][1] 当时写错了不好改)
具体代码如下:
#include<iostream>
#include<vector>
using namespace std;
#define ll long long
const ll inf=;
ll dp[][];
vector<int> a[];
void solve(int u,int f)
{
int i,j;
if(a[u].size()==&&a[u][]==f)
{
dp[u][]=inf;
dp[u][]=;
dp[u][]=inf;
//
return;
}
for(i=;i<a[u].size();i++)
{
if(a[u][i]==f) continue;
solve(a[u][i],u);
}
ll sum=;
for(i=;i<a[u].size();i++)
{
if(a[u][i]==f) continue;
sum+=dp[a[u][i]][];
}
dp[u][]=min(dp[u][],sum);
for(i=;i<a[u].size();i++)
{
if(a[u][i]==f) continue;
ll now=sum-dp[a[u][i]][]+min(dp[a[u][i]][],dp[a[u][i]][]);
ll now1=sum-dp[a[u][i]][]+dp[a[u][i]][]+;
dp[u][]=min(dp[u][],now);
dp[u][]=min(dp[u][],now1);
}
for(i=;i<a[u].size()-;i++)
for(j=i+;j<a[u].size();j++)
{
if(a[u][i]==f||a[u][j]==f) continue;
ll now=+sum-dp[a[u][i]][]-dp[a[u][j]][]+min(dp[a[u][i]][],dp[a[u][i]][])+min(dp[a[u][j]][],dp[a[u][j]][]);
//cout<<u<<i<<j<<" "<<min(dp[a[u][i]][1],dp[a[u][i]][2])<<" "<<min(dp[a[u][j]][1],dp[a[u][j]][2])<<endl;
dp[u][]=min(dp[u][],now);
} } int main()
{
int i,n,x,j,y;
cin>>n;
for(i=;i<n-;i++)
{
cin>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
}
for(i=;i<=n;i++)
for(j=;j<=;j++) dp[i][j]=inf;
solve(,-);
ll ans=inf;
ans=dp[][];
if(ans==inf) cout<<"-1"<<endl;
else cout<<ans<<endl;
//for(i=1;i<=n;i++) cout<<dp[i][0]<<" "<<dp[i][1]<<" "<<dp[i][2]<<endl;
}
POJ1848--Tree ——树形dp的更多相关文章
- 熟练剖分(tree) 树形DP
熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...
- hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)
题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: ...
- 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 161D Distance in Tree 树形dp
题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...
- hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。
/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...
- 5.10 省选模拟赛 tree 树形dp 逆元
LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...
- Codeforces Round #263 Div.1 B Appleman and Tree --树形DP【转】
题意:给了一棵树以及每个节点的颜色,1代表黑,0代表白,求将这棵树拆成k棵树,使得每棵树恰好有一个黑色节点的方法数 解法:树形DP问题.定义: dp[u][0]表示以u为根的子树对父亲的贡献为0 dp ...
- codeforces Round #263(div2) D. Appleman and Tree 树形dp
题意: 给出一棵树,每个节点都被标记了黑或白色,要求把这棵树的其中k条变切换,划分成k+1棵子树,每颗子树必须有1个黑色节点,求有多少种划分方法. 题解: 树形dp dp[x][0]表示是以x为根的树 ...
- POJ 2486 Apple Tree(树形DP)
题目链接 树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了... 看看了题解http://www.cnblogs.com/wuyiqi/archive/2 ...
- [Ccodeforces 736C] Ostap and Tree - 树形DP
给定一个n个点的树,把其中一些点涂成黑色,使得对于每个点,其最近的黑点的距离不超过K. 树形DP. 设置状态f[i][j]: 当j <= K时: 合法状态,表示i的子树中到根的最近黑点距离为j的 ...
随机推荐
- RoR - More Active Record
Active Record Scope: default_scope: 默认的检索方式 #Use unscoped to break out of the default class Hobby ...
- Spring Boot 国际化及点击链接跳转国家语言
一.国际化 在SpringBoot中已经自动帮我们配置管理国际化资源的组件,所以我们只需要编写代码就可. @Bean @ConfigurationProperties(prefix = "s ...
- LAYUI layedit 富文本框内容的取值
js 1.第一种方法 2.第二种方法
- C语言扫盲及深化学习
c语言特点: (1)效率高 (2)控制性强 (3)硬件亲和性好 (4)可移植性高 一.关于注释 c语言中注释不能嵌套,因此注释代码时一定要注意源代码中是否已经存在注释.要从逻辑上删除一段代码,利用预编 ...
- 问题记录 --Error parsing column 1 (Function_Num=10 - String)”
当C#查询数据库出现Error parsing column ## 的时候,首先去看看数据库里面该字段是什么类型,然后在看看你在创建model 的时候是什么类型,如果model的类型和数据库字段类型不 ...
- 使用charles模拟慢速网络
1.设置慢速网络 点击导航栏的proxy---throttle setting来设置想要的网络情况, 其中有两种方法: (1)勾选Enable Throttling,在Throttle presett ...
- 337A
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 60 int comp_inc(const void *first ...
- Python基础之数组和向量化计算总结
一.多维数组 1.生成ndarray (array函数) .np.array()生成多维数组 例如:import numpy as npdata1=[6,7.5,8,0,1] #创建简 ...
- git----------如何安装gitlab,使用步骤。
1.配置yum源 vim /etc/yum.repos.d/gitlab-ce.repo 2.复制以下内容到打开的文件中: [gitlab-ce] name=Gitlab CE ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃(三)
1, 前面两篇文章我们知道了怎么使用常用的四种标签,现在我们结合我们自己的项目中去简单的使用 在我们搭建项目的时候,一般会创建自己的Application,在里面进行一些初始化如一些第三方的Green ...