把树变成环
来源:互联网 发布:淘宝手淘搜索2017 编辑:程序博客网 时间:2024/04/27 23:49
HDU - 4714
题目描述:
给出一棵树,n~1000000,每次拆除一条边花费1,添加一条边花费1,问变成环的最小花费.
题解:
变成环,其实一定是变成一条链然后加一条边变成环.那么怎么变成链呢?考虑最根的根节点,子树假设已经变成链了,发现子树的链有两种可能,顶底是链段,顶点不是链端,如果不是链段,一定要出来,如果是链段,可能可以不去掉.那么dp就有第二维标记了,0代表随便,只要变成链,1代表必须要求顶点为链段.然后怎么dp呢?每一层横着dp过去,正常写就好.
重点:
题目的转换,环变链,然后分类变成了dp.
代码:
#pragma comment(linker,"/STACK:102400000,102400000")//防爆栈#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#define CLR(a) memset(a, 0, sizeof(a))#define REP(i, a, b) for(int i = a;i < b;i++)#define REP_D(i, a, b) for(int i = a;i <= b;i++)typedef long long ll;using namespace std;const int maxn = 1e6 + 10;const int INF = 1e8;vector<int> G[maxn];int n, dp[maxn][2];//0代表最小,1代表强制顶点void dfs(int u, int fa){ REP(i, 0, G[u].size())//因为要横着dp,先跑出来吧. { int v = G[u][i]; if(v!=fa) { dfs(v, u); } } int flag = 0; int f_0, f_1, f_2; f_0 = 0;//没有链段端 f_1 = INF;//1个链端 f_2 = INF;//两个链端 int cnt = 0, sum = 0; REP(i, 0, G[u].size()) { int v = G[u][i]; if(v!=fa) { flag = 1; f_2 = min(f_2 + dp[v][0] + 2, f_1+dp[v][1]);//v是不是一个链端 if(f_2 > INF) f_2 = INF; f_1 = min(f_1 + dp[v][0] + 2, dp[v][1]+cnt*2+sum);//v是不是一个链端 cnt++; sum += dp[v][0]; } } if(flag == 0)//特殊情况,叶子节点 { dp[u][0] = dp[u][1] = 0; return; } dp[u][0] = min(f_1, f_2); dp[u][1] = f_1;}void solve(){ dfs(1, 0); int ans = dp[1][0]; printf("%d\n", ans+1);//结果+1}int main(){ // freopen("4Din.txt", "r", stdin); //freopen("4Dout.txt", "w", stdout); int ncase; scanf("%d", &ncase); while(ncase--) { scanf("%d", &n); REP_D(i, 1, n) { G[i].clear(); } REP_D(i, 1, n - 1) { int a, b; scanf("%d%d", &a, &b); G[a].push_back(b); G[b].push_back(a); } solve(); } return 0;}
0 0
- 把树变成环
- 把知识变成财富
- 把信息变成商机
- 把自己变成水
- 把生活变成诗歌
- 把存款变成资本
- 把List变成Map
- 把中文变成zhongwen
- 把图片变成圆形
- 把有意思变成喜欢
- 把Bitmap变成String
- 把二元查找树变成双向链表
- 把二元查找树变成双向链表
- 常量空间把一个二叉树变成链表
- 把Gmail变成HTML空间
- 把数据库文件变成XML文件
- 把一个变量变成integer
- 把乘法变成加法 模板
- activiti-5.17 暂不支持servlet 2.5即tomcat6 .
- Windows 下主程序与动态库(*.dll)释放对方分配的内存操作要点
- 去掉Xcode工程中的某种类型的警告 Implicit conversion loses integer precision: 'NSInteger' (aka 'long') to 'int32
- Java中可变长参数的使用及注意事项
- 黄颀老师优秀学员:GRE语文160+获美国名校录取
- 把树变成环
- Mac 连接上中文乱码WiFi
- OC语言中的block数据类型
- Sql语句将0 1转化为男女性别
- bluehost 安装Zen Cart
- ADT22添加的Android Private Libraries导致第三方jar包的ClassNotFoundException
- 新SAT官方范文得分的分段分析
- Android PopupWindow的使用和分析
- 敏捷开发之Scrum扫盲篇