题意:给你一棵树,你选择删掉一条边,再加上一条边(也要保证为树),问最后树上的节点能够两两完美匹配的加删边方案数?

n<=5e5.

标程:

 1 #include<cstdio>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 int read()
 6 {
 7    int x=0;char ch=getchar();
 8    while (ch<'0'||ch>'9') ch=getchar();
 9    while ('0'<=ch&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
10    return x;
11 }
12 const int N=500005;
13 typedef long long ll;
14 int size[N],n,u,v;
15 ll ans;
16 vector<int> vec[N];
17 struct node{int a[2][2];}f[N],g[N];
18 vector<node> pre[N];
19 void init(node &x){x.a[0][0]=1;x.a[0][1]=x.a[1][0]=x.a[1][1]=0;}
20 node modi(node x,node y)
21 {
22     node c;
23     c.a[0][0]=x.a[0][0]*y.a[1][0];
24     c.a[1][0]=x.a[0][0]*y.a[0][0]+x.a[1][0]*y.a[1][0];
25     c.a[0][1]=x.a[0][1]*y.a[1][0]+x.a[0][0]*(y.a[1][1]+y.a[0][0]);
26     c.a[1][1]=x.a[1][1]*y.a[1][0]+x.a[1][0]*(y.a[1][1]+y.a[0][0])+x.a[0][0]*y.a[0][1]+x.a[0][1]*y.a[0][0];
27     return c;
28 }
29 node merge(node x,node y)
30 {
31    node c;
32    c.a[0][0]=x.a[0][0]*y.a[0][0];
33    c.a[1][0]=x.a[1][0]*y.a[0][0]+x.a[0][0]*y.a[1][0];
34    c.a[0][1]=x.a[0][1]*y.a[0][0]+x.a[0][0]*y.a[0][1];
35    c.a[1][1]=x.a[1][1]*y.a[0][0]+x.a[1][0]*y.a[0][1]+x.a[0][1]*y.a[1][0]+x.a[0][0]*y.a[1][1];
36    return c;
37 }
38 void dp1(int x,int fa)
39 {
40     size[x]=1;init(f[x]);
41     if (fa!=-1) vec[x].erase(find(vec[x].begin(),vec[x].end(),fa));//将fa删去,方便前后缀的处理
42     for (int i=0;i<vec[x].size();i++)
43     {
44       int v=vec[x][i]; //注意内部定义
45       dp1(v,x);size[x]+=size[v];
46       f[x]=modi(f[x],f[v]);
47     }
48 }
49 void dp2(int x,int fa)
50 {
51     node cur;init(cur);
52     if (fa>0) pre[x].push_back(modi(cur,g[x]));else pre[x].push_back(cur);
53     for (int i=0;i<vec[x].size();i++)
54       pre[x].push_back(modi(pre[x].back(),f[vec[x][i]]));
55     for (int i=vec[x].size()-1;i>=0;i--)
56     {
57        int v=vec[x][i];
58        g[v]=merge(pre[x][i],cur);cur=modi(cur,f[v]);
59        dp2(v,x);
60     }
61 }
62 int main()
63 {
64     n=read();if (n&1) return puts("0"),0;
65     for (int i=1;i<n;i++) u=read(),v=read(),vec[u].push_back(v),vec[v].push_back(u);
66     dp1(1,-1);dp2(1,-1);
67     for (int i=2;i<=n;i++)
68       if (f[i].a[1][0]&&g[i].a[1][0]) ans+=(ll)size[i]*(n-size[i]);
69       else ans+=(ll)(f[i].a[0][0]+f[i].a[1][1])*(g[i].a[0][0]+g[i].a[1][1]);
70     printf("%lld\n",ans);
71     return 0;
72 }

易错点:1.转移式子要认真推。

2.注意函数内部定义变量。

3.将fa在vector中删去,方便前后缀寻址的对应。

题解:dp

把一条边删掉,树就分成了两个子树。要么各自匹配(这样怎么连都可以),要么连一条边后边的端点匹配,也就是两个子树在没有连边前各有一个点没有匹配。

f[i][0/1][0/1]表示以i为根的子树,根是否被匹配,子树中是否恰有一个点未被匹配的未匹配点的选法数。

g表示i为根的子树外的部分的答案(以fa[i]为根)。正反dp两遍后统计答案即可。

转载于:https://www.cnblogs.com/Scx117/p/8861765.html

CF891D Sloth相关推荐

  1. sloth——算法工程师标注数据的福音

    一般算法工程师做标注,都要先开发个标注工具,无非下面几个选项: 1.mfc,C#,优点是交互界面友好,开发难度适中,缺点是没法跨平台 2.matlab,优点是可以跨平台,开发难度非常低,缺点是速度慢. ...

  2. 资源 | 深度学习图像标注工具汇总

    作者 | chaibubble 来源 | CSDN 网站 对于监督学习算法而言,数据决定了任务的上限,而算法只是在不断逼近这个上限.世界上最遥远的距离就是我们用同一个模型,但是却有不同的任务.但是数据 ...

  3. 深度学习经典数据集汇总

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 很多朋友在学习了神经网络和深度学习之后,早已迫不及待要开始动手实战 ...

  4. 关于数据中台的深度思考与总结(超级干货)

    本文将总结下数据中台的相关理论知识.Flink平台化需要改进的点等等,参考<数据中台>. 原文地址:https://miaowenting.site/2020/03/24/%E5%85%B ...

  5. 网易实时数仓实践与展望

    分享嘉宾:马进 网易杭研 技术专家 编辑整理:张满意 出品平台:DataFunTalk 导读:随着大数据技术的进步,各种计算框架的涌现,数据仓库相关技术难题已经从离线数仓逐渐过渡到实时数仓,越来越多的 ...

  6. 超级干货:关于数据中台的深度思考与总结

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | http://dwz.date/aHTb 本文 ...

  7. 一些今天看到的好句子

    1. 记住该记住的,忘记该忘记的.改变能改变的,接受不能改变的 Remember what should be remembered, and forget what should be forgot ...

  8. 大数据方面核心技术有哪些?新人必读

    大数据技术的体系庞大且复杂,基础的技术包含数据的采集.数据预处理.分布式存储.NoSQL数据库.数据仓库.机器学习.并行计算.可视化等各种技术范畴和不同的技术层面.首先给出一个通用化的大数据处理框架, ...

  9. 深度学习核心技术精讲100篇(三十二)-网易实时数仓实战应用

    前言 随着大数据技术的进步,各种计算框架的涌现,数据仓库相关技术难题已经从离线数仓逐渐过渡到实时数仓,越来越多的企业对数据的实时性提出了严格的要求,如何满足企业的低延时的数据需求,如何看待批量处理和实 ...

  10. 如何自动搞定全站图片的alt属性?

    Web开发人员和内容编辑人员经常会忘记或忽略了img标签的alt属性,这是一个可以提升网站可访问性和SEO性能的重要部分,这个属性通常用来描述图片: ​​​\u0026lt;img src=\u002 ...

最新文章

  1. 美多商城之用户注册(展示用户注册页面)
  2. yjv是电缆还是电线_电力电缆YJV与BVV二者之间的区别是什么?
  3. flask第十八篇——模板【2】
  4. faster rcnn 数据格式
  5. php ttf 字体 url,window_TTF字体文件如何安装 TTF文件打不开解决方法,TTF文件是Windows系统下的字体文 - phpStudy...
  6. Effective_STL 学习笔记(四十四) 尽量使用成员函数代替同名的算法
  7. volatile的适用场合
  8. dw如何写php代码提示,DW CS5 jquery代码提示插件
  9. java无权图求最短路径_求有权图和无权图的最短路径
  10. Flutter基础—应用实例
  11. 取代不了 C/C++ 的 Rust 如何“逆袭”?
  12. mysql修改表名,列名,列类型,添加表列,删除表列
  13. http缓存与cdn相关技术
  14. python 字典类型 get 参数_python如何利用urllib解析url参数成字典
  15. poj2387(Dijkstra)
  16. Python爬取下载网易云音乐
  17. 解决达梦数据库如何查找表字段名。
  18. Kuhn-Munkres(KM算法)简单笔记
  19. 计算机研究生考试题,全国研究生考试计算机统考试题及答案-20210522014129.docx-原创力文档...
  20. 【WINDOWS / DOS 批处理】if命令实现逻辑运算符

热门文章

  1. pr里面怎么加css样式,PR剪辑中如何添加字幕
  2. 护理自考本科科目计算机应用基础,护理自考本科考哪些科目
  3. vim编辑器 解决vim编辑异常
  4. RuntimeError: The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimensio
  5. k8s查看token,discovery-token-ca-cert-hash
  6. 前端面试及答案:boder实现0.5像素的方法
  7. 阿里云域名SSL证书安装
  8. python pygame 游戏实战:Maze 迷宫生成,显示和游戏(附全部代码)
  9. 【MVO MTSP】基于matlab灰狼算法求解多旅行商问题(同始终点)【含Matlab源码 1564期】
  10. 网站整体策划书的撰写