【佛山市选2013】JZOJ2020年8月7日提高组T2 树环转换

题目

描述

给定一棵N个节点的树,去掉这棵树的一条边需要消耗值1,为这个图的两个点加上一条边也需要消耗值1。树的节点编号从1开始。在这个问题中,你需要使用最小的消耗值(加边和删边操作)将这棵树转化为环,不允许有重边。

环的定义如下:

  • 该图有N个点,N条边。
  • 每个顶点的度数为2。
  • 任意两点是可达的。

树的定义如下:

  • 该图有N个点,N-1条边。
  • 任意两点是可达的。

数据

对于20%的数据,有1≤N≤10。

对于100%的数据,有1≤N≤1000000。

题解

题意

给出一棵树

每次删边加边的代价都为一

问最小代价将树转成环

分析

看到树呢,很容易 (个屁) 想到树形DP

但是如果直接设状态的话不好转移

思考:环是什么

不就是一条链再加上一条边吗

一条链是什么

特殊的树呀!

那么就可以设\(f[i]\)表示以\(i\)为根的子树转成链的最小代价

如果想去推方程的话,先别急

我们来看一下什么是链



一张丑陋的图

很容易发现

除了第一个和最后一个点

其他节点的度数都为2

那么是不是可以设\(f[i][0]\)表示根节点\(i\)转换成链之后是两个端点中的一个的最小代价,\(f[i][1]\)表示不管\(i\)的位置的最小代价

放方程:

告知:\(S\)表示\(\sum_\ f[son][1]\),\(c\)表示儿子的个数,\(u,v\)是\(i\)的儿子

\(f[i][0]=min\begin{cases}S+2c\\S-(f[u][1]-f[u][0])+2*(c-1)\end{cases}\)

\(f[i][1]=min\begin{cases}f[i][0]\\S-(f[u][1]-f[u][0]+2*(c-2)\end{cases}\)

小小的优化:

对于\(u,v\)的话,既然要使更小,那么\(f[u][1]-f[u][0]\)之类的就要最大

记一下最大和次大就可以了

至于解释的话





另外就是

本题卡系统栈!!!

所以你可以打\(BFS\)或者开人工栈

Code

  1. #include<cstdio>
  2. #include<iostream>
  3. #define inf 99999999
  4. using namespace std;
  5. struct node
  6. {
  7. int to,next,head;
  8. }a[2000005];
  9. int n,i,x,y,tot,f[1000005][3],d[1000005],father[1000005];
  10. bool b[1000005];
  11. void add(int x,int y)
  12. {
  13. tot++;
  14. a[tot].to=y;
  15. a[tot].next=a[x].head;
  16. a[x].head=tot;
  17. }
  18. void bfs(int now)
  19. {
  20. int i,j,h,t,x,mx1,mx2,s,num;
  21. h=0;
  22. t=1;
  23. d[1]=now;
  24. b[now]=true;
  25. while (h<t)
  26. {
  27. h++;
  28. for (i=a[d[h]].head;i;i=a[i].next)
  29. {
  30. x=a[i].to;
  31. if (b[x]==false)
  32. {
  33. t++;
  34. d[t]=x;
  35. b[x]=true;
  36. }
  37. else father[d[h]]=x;
  38. }
  39. }
  40. for (j=t;j;j--)
  41. {
  42. mx1=mx2=-inf;
  43. num=s=0;
  44. for (i=a[d[j]].head;i;i=a[i].next)
  45. {
  46. x=a[i].to;
  47. if (x!=father[d[j]])
  48. {
  49. num++;
  50. s+=f[x][1];
  51. if (f[x][1]-f[x][0]>mx1)
  52. {
  53. mx2=mx1;
  54. mx1=f[x][1]-f[x][0];
  55. }
  56. else
  57. {
  58. if (f[x][1]-f[x][0]>mx2) mx2=f[x][1]-f[x][0];
  59. }
  60. }
  61. }
  62. f[d[j]][0]=min(s+2*num,s-mx1+2*(num-1));
  63. f[d[j]][1]=min(f[d[j]][0],s-mx1-mx2+2*(num-2));
  64. }
  65. }
  66. int main()
  67. {
  68. freopen("T2.in","r",stdin);
  69. freopen("T2.out","w",stdout);
  70. scanf("%d",&n);
  71. for (i=1;i<n;i++)
  72. {
  73. scanf("%d%d",&x,&y);
  74. add(x,y);
  75. add(y,x);
  76. }
  77. bfs(1);
  78. printf("%d\n",min(f[1][0],f[1][1])+1);
  79. fclose(stdin);
  80. fclose(stdout);
  81. return 0;
  82. }

【佛山市选2013】JZOJ2020年8月7日提高组T2 树环转换的更多相关文章

  1. 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你

    [五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...

  2. JZOJ2020年8月11日提高组T2 宝石

    JZOJ2020年8月11日提高组T2 宝石 题目 Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是 ...

  3. 【GDKOI2014】JZOJ2020年8月13日提高组T2 石油储备计划

    [GDKOI2014]JZOJ2020年8月13日提高组T2 石油储备计划 题目 Description Input Output 对于每组数据,输出一个整数,表示达到"平衡"状态 ...

  4. 【NOIP2015模拟11.4】JZOJ2020年8月6日提高组T2 最优交换

    [NOIP2015模拟11.4]JZOJ2020年8月6日提高组T2 最优交换 题目 题解 题意 有一个长度为\(n\)的正整数 最多可以进行\(k\)次操作 每次操作交换相邻两个位置上的数 问可以得 ...

  5. 【佛山市选2013】JZOJ2020年8月7日提高组T3 海明距离

    [佛山市选2013]JZOJ2020年8月7日提高组T3 海明距离 题目 描述 对于二进制串a,b,他们之间的海明距离是指两个串异或之后串中1的个数.异或的规则为: 0 XOR 0 = 0 1 XOR ...

  6. 【佛山市选2013】JZOJ2020年8月7日提高组T1 回文子序列

    [佛山市选2013]JZOJ2020年8月7日提高组T1 回文子序列 题目 描述 回文序列是指左右对称的序列.例如1 2 3 2 1是回文序列,但是1 2 3 2 2就不是.我们会给定一个N×M的矩阵 ...

  7. 【GDOI2007】JZOJ2020年8月10日提高组T1 夏娜的菠萝包

    [GDOI2007]JZOJ2020年8月10日提高组T1 夏娜的菠萝包 题目 Description 夏娜很喜欢吃菠萝包,她的经纪人RC每半个月就要为她安排接下来的菠萝包计划.今天是7月份,RC又要 ...

  8. JZOJ2020年8月11日提高组T4 景点中心

    JZOJ2020年8月11日提高组T4 景点中心 题目 Description 话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观.镇海中学共有n个景点,每个 ...

  9. JZOJ2020年8月11日提高组T3 页

    JZOJ2020年8月11日提高组T3 页 题目 Description 战神阿瑞斯听说2008年在中华大地上,将举行一届规模盛大的奥林匹克运动会,心中顿觉异常兴奋,他想让天马在广阔的天空上,举行一场 ...

随机推荐

  1. [Luogu P1006]传纸条 (网格DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P1006 Solution 挺显然但需要一定理解的网络(应该是那么叫吧)DP 首先有一个显然但重要的结论要发 ...

  2. 面试小问题——Object中有哪些常用方法?

    一.equals方法 Object类中的equals方法用于检测一个对象是否等于另外一个对象.Java语言规范要求equals方法具有下面的特性: (1)自反性:对于任何非空引用x,x.equals( ...

  3. 《为研发同学定制的MySQL面试指南》-- 连载中

    Hi大家好,我是来自博客园的赐我白日梦! 为大家带来MySQL面试专题!全文110篇!以问答的方式,由浅入深的帮你应对各类MySQL面试题的狂轰滥炸!当然也不乏会分享一些高阶读写分离数据库中间件原理及 ...

  4. Grafana+Prometheus+node_exporter监控,Grafana无法显示数据的问题

    环境搭建: 被测linux机器上部署了Grafana,Prometheus,node_exporter,并成功启动了它们. Grafana中已经创建了Prometheus数据源,并测试通过,并且导入了 ...

  5. MVC中Cookie的用法(二)---CookieHelper

    public class CookieHelper { /// <summary> /// 1.1添加Cookie /// </summary> /// <param n ...

  6. 白话科普系列——双十一,竟然是一场有“预谋”的DDoS攻击?

    随著互联网与信息技术的发展,所有人都在享受互联网带来的舒适和便利.如今,无论是个人社交行为,还是商业活动都早已离不开互联网. 但是,网络空间在创造机遇的同时,也带来了威胁.随着企业价值.知名度的提高. ...

  7. C# 泛型集合的自定义类型排序

    一.泛型集合List<T>排序 经sort方法之后,采用了升序的方式进行排列的. List<int> list = new List<int>() { 2, 4, ...

  8. Ques1,debug模式打不开的原因

    我尝试过一下三种方法打开pycharm环境下Flask的debug模式,但是都失败了.这三种具体方法如下: 1, 2, 3, 可以说上述方法都是常规操作,可是为啥还是不能打开debug模式呢? 因为: ...

  9. 线程安全的SimpleDateFormat

    import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; imp ...

  10. 手写atoi、strcpy、strcat

    一:实现atoi函数 1 #include<iostream> 2 3 using namespace std; 4 5 int atoi_my(const char *str) 6 { ...