题目传送门

题意:

  给定一棵n个点的边权为0或1的树,一条合法的路径(x,y)(x≠y)满足,从x走到y,一旦经过边权为1的边,就不能再经过边权为0的边,求有多少边满足条件?

思路:

  首先,这道题也可以用并查集的做法过,点这里

  那换根dp怎么写呢?

  设$f[u]$为以1为根,自下而上到$u$的末节点是1的合法路径数量,$g[u]$代表以1为根,自下而上到$v$末节点是0的合法路径数量,这个可以通过一遍dfs简单求解。

  再设$nf[u]$和$ng[u]$代表以u为根的两种合法路径数量,进行换根dfs,在换根的过程中:

  若某一条边是0边,则:

    $ng[st.to]=ng[u]$,$nf[st.to]=f[st.to]$。这个方程也很好理解,白边的路径是不会变的,所有从父节点自上而下转移过来的黑边到了这里都是非法路径了。

  若某一条边是1边,则:

    $ng[st.to]=g[st.to]$,$nf[st.to]=nf[u]-g[st.to]+ng[u]$,白边只有从下往上过来的了。黑边要减去  到当前位置为白边与父节点的黑边连接形成的边 ,再加上父节点是白边,加上黑边形成的边。

  1. #pragma GCC optimize (2)
  2. #pragma G++ optimize (2)
  3. #pragma comment(linker, "/STACK:102400000,102400000")
  4. #include<bits/stdc++.h>
  5. #include<cstdio>
  6. #include<vector>
  7. #define rep(i,a,b) for(int i=a;i<=b;i++)
  8. #define dep(i,b,a) for(int i=b;i>=a;i--)
  9. #define clr(a,b) memset(a,b,sizeof(a))
  10. #define pb push_back
  11. #define pii pair<int,int >
  12. using namespace std;
  13. typedef long long ll;
  14. const int maxn=;
  15. ll rd()
  16. {
  17. ll x=,f=;char ch=getchar();
  18. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  19. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  20. return x*f;
  21. }
  22. int T;
  23. struct edge{
  24. int to,w;
  25. };
  26. vector<edge>ve[maxn];
  27. int f[maxn],g[maxn],nf[maxn],ng[maxn];
  28. int n,m;
  29. ll ans;
  30. void dfs_1(int u,int fa){
  31. for(auto &st:ve[u]){
  32. if(st.to==fa)continue;
  33. dfs_1(st.to,u);
  34. if(st.w==){
  35. g[u]+=g[st.to]+;
  36. }else{
  37. f[u]+=f[st.to]++g[st.to];
  38. }
  39. }
  40. }
  41. void dfs_2(int u,int fa){
  42. ans+=nf[u]+ng[u];
  43. for(auto &st:ve[u]){
  44. if(st.to==fa)continue;
  45. if(st.w==){
  46. ng[st.to]=ng[u];
  47. nf[st.to]=f[st.to];
  48. }else{
  49. ng[st.to]=g[st.to];
  50. nf[st.to]=nf[u]-g[st.to]+ng[u];
  51. }
  52. dfs_2(st.to,u);
  53. }
  54. }
  55. int main(){
  56. cin>>n;
  57. rep(i,,n-){
  58. int u,v,w;
  59. scanf("%d%d%d",&u,&v,&w);
  60. ve[u].pb({v,w});
  61. ve[v].pb({u,w});
  62. }
  63. dfs_1(,);
  64. nf[]=f[],ng[]=g[];
  65. dfs_2(,);
  66. cout<<ans<<endl;
  67. }

codeforces1156D 0-1-Tree 换根dp的更多相关文章

  1. [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]

    题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...

  2. 换根DP+树的直径【洛谷P3761】 [TJOI2017]城市

    P3761 [TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公 ...

  3. 小奇的仓库:换根dp

    一道很好的换根dp题.考场上现场yy十分愉快 给定树,求每个点的到其它所有点的距离异或上m之后的值,n=100000,m<=16 只能线性复杂度求解,m又小得奇怪.或者带一个log像kx一样打一 ...

  4. 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4827 ​ 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...

  5. Acesrc and Travel(2019年杭电多校第八场06+HDU6662+换根dp)

    题目链接 传送门 题意 两个绝顶聪明的人在树上玩博弈,规则是轮流选择下一个要到达的点,每达到一个点时,先手和后手分别获得\(a_i,b_i\)(到达这个点时两个人都会获得)的权值,已经经过的点无法再次 ...

  6. bzoj 3566: [SHOI2014]概率充电器 数学期望+换根dp

    题意:给定一颗树,树上每个点通电概率为 $q[i]$%,每条边通电的概率为 $p[i]$%,求期望充入电的点的个数. 期望在任何时候都具有线性性,所以可以分别求每个点通电的概率(这种情况下期望=概率 ...

  7. [Bzoj3743][Coci2015] Kamp【换根Dp】

    Online Judge:Bzoj3743 Label:换根Dp,维护最长/次长链 题目描述 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的 ...

  8. 洛谷$P3647\ [APIO2014]$连珠线 换根$dp$

    正解:换根$dp$ 解题报告: 传送门! 谁能想到$9102$年了$gql$居然还没写过换根$dp$呢,,,$/kel$ 考虑固定了从哪个点开始之后,以这个点作为根,蓝线只可能是直上直下的,形如&qu ...

  9. POJ 3585 Accumulation Degree【换根DP】

    传送门:http://poj.org/problem?id=3585 题意:给定一张无根图,给定每条边的容量,随便取一点使得从这个点出发作为源点,发出的流量最大,并且输出这个最大的流量. 思路:最近开 ...

随机推荐

  1. elasticsearch Java Client用户指南

    这里使用的Java客户端版本是5.1.2,Elasticsearch的版本号也要是5.1.2,否则一些功能可能不支持. 之前介绍过Spring Data Elasticsearch,那里也是使用了本文 ...

  2. centos 搭建本地YUM源并使用apache共享YUM源

    搭建本地YUM源 1.挂载镜像 2.搭建本地YUM源 删除多余repo文件保留一个就行 本地YUM源就搭建好了 yum repolist 查看yum源 3.使用apache共享YUM源 YUM服务器配 ...

  3. JavaScript值传递和引用传递

    1、数据类型:boolean,null,undefined,String,Number,指向包含的数据,进行“值传递”: 2.非数据类型:Array,Function,Object,指向了一个内存地址 ...

  4. DVR和NVR的区别(深度好文)(转)

    DVR接模拟摄像机,NVR是接IP camera的录像机. DVR的录像效果取决于摄像机与DVR本身的压缩算法与芯片处理能力,而NVR的录像效果则主要取决于IPcamera,因为IPcamera输出的 ...

  5. Android 编译笔记20191205

    gradle下载很慢 解决问题的方法如下: 使用文件管理器 打开用户主目录 windows平台: c:\Users\用户名\.gradle macos平台: /Users/用户名/.gradle li ...

  6. CH340电路设计

    版权声明:技术需要共享,但同时需要尊重原创者的辛劳,转载引用请注明出处. https://blog.csdn.net/JAZZSOLDIER/article/details/66967735 最近选用 ...

  7. Anaconda 安装 pytorch报错解决方法

    一.安装Pytorch: # -c 指定用pytorch镜像源下载软件conda install pytorch torchvision cpuonly -c pytorch 报错: 二.配置: ch ...

  8. sql的分页

    public static string GetPageSql(string sql, int start, int end)        {            return string.Fo ...

  9. delphi 动态获取文件类型的图标

    delphi 动态获取文件类型的图标.txt我不奢望什么,只希望你以后的女人一个不如一个.真怀念小时候啊,天热的时候我也可以像男人一样光膀子!在应用程序的编写中,组合框(ComboBox).列表框(L ...

  10. ShopNC多用户商城标题去版权 后台去版权方法2.0版本

    一.前台标题: \framework\tpl\nc.php 第85行 $output['html_title'] = ( $output['html_title'] != "" ? ...