题意

给定一棵无根树,删除或连接一条边的代价为\(1\),求把树变为环的最小代价.

前置思路

如果删除了\(k\)条边,使得树变成\((k+1)\)条链,再用\((k+1)\)次连接操作把树变成一个环,那么总代价为\((2 \times k +1)\).

问题转化为求\(k\)的最小值,即最少能将一棵树分为多少条链.

思路1 树形DP

树形DP求最少能将一棵树分为多少条链.

采用像极了CF633F的思路,设\(DP[i][0]\)表示最少能将\(i\)的子树分为多少条链,\(DP[i][1]\)表示在\(i\)的子树中有一条可以向上继续拓展的链的情况下,最少能将\(i\)的子树分为多少条链.

如果我们令\(1\)节点为树根,答案即为\(DP[1][0]\).

状态转移方程:

如果我们记\(F(u)=DP[u][1]-DP[u][0]\).那么:

\[DP[u][1]=\min(F(v))
+\sum_vDP[v][0]\quad (v\in son(u))\]

\(\min(F(v))\)的含义是,找一条可以向上继续拓展的链,使它继续向上扩展.

\[DP[u][0]=\min(F(v))+ \min2(F(v))
+\sum_vDP[v][0]\quad (v\in son(u))\]

其中\(\min2( )\)表示非严格次小值.

\(\min(F(v))+ \min2(F(v))\)的含义是,找两条可以继续向上扩展的链,在\(u\)点把他们接在一起.

代码:

#include<bits/stdc++.h>
const int SIZE=200005,INF=0x3F3F3F3F; int head[SIZE],nex[SIZE],to[SIZE],P,DP[SIZE][2];
void Link(int u,int v)
{
nex[++P]=head[u];head[u]=P;to[P]=v;
nex[++P]=head[v];head[v]=P;to[P]=u;
} int F(int u){return DP[u][1]-DP[u][0];}
void DFS(int u,int Fa)
{
int min1=INF,min2=INF,Cnt=0,sum=0;
for(int i=head[u];i;i=nex[i])
{
int v=to[i];
if(v==Fa)continue;
DFS(v,u);
++Cnt;
sum+=DP[v][0];
if(min1>F(v))min1=F(v);
else if(min2>F(v))min2=F(v);
}
if(Cnt==0)DP[u][1]=DP[u][0]=1;
else if(Cnt==1)DP[u][1]=DP[u][0]=std::min(sum+1,sum+min1);
else
{
DP[u][1]=sum+min1;
DP[u][0]=std::min(sum+min1+min2-1,DP[u][1]);
}
} int main()
{
int n,u,v;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
Link(u,v);
}
DFS(1,0);
printf("%d",2*DP[1][0]-1);
return 0;
}

思路2 贪心

本题贪心过程非常巧妙,可以通过DFS遍历整棵树,回溯时,如果一个节点的度数\(>2\),就删掉多余的点,优先删父节点,这样可以使回溯到父节点时的答案更优,这一步答案也不会更劣.

HDU4714 Tree2cycle 解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. [POI2004]PRZ [枚举子集]

    怎么全是 模拟退火 啊,这明明是个 枚举子集 的板子题. 考虑 \(n \leq 16\) 二进制没错了.. \(dt_i\) 表示 \(i\) 这个状态下 \(\max{t_j}\),\([\tex ...

  2. 第31届IMO 第2题

    题目 设n>=3,考虑一个圆上由2n-1个不同点构成的集合E.现给E中恰好k个点染上黑色,如果至少有一对黑点使得这两个黑点之间的弧上(两段弧中的某一个)包含恰好E中的n个点,就成这样的染色方法是 ...

  3. UVA750回溯法典例-八皇后

    文章代码选自UVA750-8 Queens Chess Problem的部分代码 vj题目链接:https://vjudge.net/problem/UVA-750 由于UVA中要求按照字典序输出,下 ...

  4. 小希的迷宫 HDU - 1272

    #include<iostream> #include<algorithm> #include<cstring> using namespace std; cons ...

  5. IDEA科学使用

    今天莫名激活码又用不起了有能力的支持正版吧 ,要用的时候又去网上到处找然后发现各种用不了,去淘宝又怕被骗博主就是过来人 ,总算下定决心写一篇一劳永逸的方法.. 方法一:合理使用激活码 用过idea的都 ...

  6. 【巨杉数据库Sequoiadb】点燃深秋,巨杉数据库亮相DTC数据技术嘉年华大会

    2019年11月15日,第九届数据技术嘉年华大会在北京隆重召开,本次大会以  “开源 • 智能 • 云数据 - 自主驱动发展 创新引领未来” 为主题,探索数据价值,共论智能未来.SequoiaDB 巨 ...

  7. ctf-ping命令执行绕过

    题目连接:http://ctf.klmyssn.com/challenges#Ping 命令执行绕过,试了试过滤了一些:一些命令 但是反引号可以执行命令 通过拼接,可以拼接出来:ls 命令 127.0 ...

  8. Linux下用Bash语言实现判断素数的功能

    题目链接: 题目描述 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息. 输入 一个数 输出 如果是素数输出prime 如果不是输出not prime 样例输入 97 样例输出 pri ...

  9. springBoot 发送邮件图片不显示

    解决方案 MimeMessageHelper 的执行顺序错了,先执行 setText() 然后执行 addInline() 添加图片 <img src="cid:p03"/& ...

  10. 白面系列 kafka

    kafka是一个分布式发布订阅消息系统,也可叫做MQ系统,MQ是Message Queue,消息队列. 通俗点,生产者往队列里写消息,消费者从队列里读.专业点,Producer通过TCP协议发送消息到 ...