主要卡在一个结论上。。关于点双有一个常用结论,也经常作为在圆方树/简单路径上的良好性质,对于任意点双内互不相同的三点$s,c,t$,都存在简单路径$s\to c\to t$,证明不会。可以参见clz博客。。我就是跟着他学的

然后就好办了,转化为树上两点计经过点双内所有点个数,然后赋权后变为统计两两圆点对的路径权值和,这个就是一个树形DP,统计每个点作为圆点或者方点被所有路径经过多少次,加入答案。。

还是比较裸的,因为重点还在于这个很多题都出现到的点双的简单路径的性质。。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. #define mst(x) memset(x,0,sizeof x)
  8. #define dbg(x) cerr << #x << " = " << x <<endl
  9. #define dbg2(x,y) cerr<< #x <<" = "<< x <<" "<< #y <<" = "<< y <<endl
  10. using namespace std;
  11. typedef long long ll;
  12. typedef double db;
  13. typedef pair<int,int> pii;
  14. template<typename T>inline T _min(T A,T B){return A<B?A:B;}
  15. template<typename T>inline T _max(T A,T B){return A>B?A:B;}
  16. template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
  17. template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
  18. template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
  19. template<typename T>inline T read(T&x){
  20. x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
  21. while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
  22. }
  23. const int N=1e5+;
  24. struct thxorz{
  25. int head[N<<],nxt[N<<],to[N<<],tot;
  26. inline void add(int x,int y){
  27. to[++tot]=y,nxt[tot]=head[x],head[x]=tot;
  28. to[++tot]=x,nxt[tot]=head[y],head[y]=tot;
  29. }
  30. }G1,G2;
  31. int n,m;
  32. ll ans;
  33. int val[N<<],siz[N<<],cnt,Siz;
  34. int dfn[N],low[N],stk[N],top,tim;
  35. #define y G1.to[j]
  36. void tarjan(int x){
  37. dfn[x]=low[x]=++tim,stk[++top]=x,++Siz;
  38. for(register int j=G1.head[x];j;j=G1.nxt[j]){
  39. if(!dfn[y]){
  40. tarjan(y),MIN(low[x],low[y]);
  41. if(low[y]==dfn[x]){
  42. int tmp,sum=;++cnt;
  43. do tmp=stk[top--],G2.add(cnt,tmp),val[tmp]=-,++sum;while(tmp^y);
  44. G2.add(cnt,x),val[x]=-;val[cnt]=++sum;
  45. }
  46. }
  47. else MIN(low[x],dfn[y]);
  48. }
  49. }
  50. #undef y
  51. #define y G2.to[j]
  52. void dp(int x,int fa){
  53. int d=x<=n;siz[x]=d;
  54. for(register int j=G2.head[x];j;j=G2.nxt[j])if(y^fa){
  55. dp(y,x),siz[x]+=siz[y];
  56. ans+=siz[y]*1ll*(Siz-siz[y])*val[x];
  57. }
  58. ans+=d*(Siz-)*1ll*val[x]+(Siz-siz[x])*1ll*siz[x]*val[x];
  59. }
  60. #undef y
  61. int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
  62. read(n),read(m);cnt=n;
  63. for(register int i=,x,y;i<=m;++i)read(x),read(y),G1.add(x,y);
  64. for(register int i=;i<=n;++i)if(!dfn[i]){
  65. Siz=top=;tarjan(i),dp(i,);
  66. }
  67. printf("%lld\n",ans);
  68. return ;
  69. }

总结:图上简单路径题多半和点双有关系

loj2587 「APIO2018」铁人两项[圆方树+树形DP]的更多相关文章

  1. LOJ 2587 「APIO2018」铁人两项——圆方树

    题目:https://loj.ac/problem/2587 先写了 47 分暴力. 对于 n<=50 的部分, n3 枚举三个点,把图的圆方树建出来,合法条件是 c 是 s -> f 路 ...

  2. [APIO2018] Duathlon 铁人两项 圆方树,DP

    [APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ...

  3. [APIO2018]铁人两项——圆方树+树形DP

    题目链接: [APIO2018]铁人两项 对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次. 那么我们建出原图的圆方 ...

  4. loj2587 「APIO2018」铁人两项

    圆方树orz,参见猫的课件(apio和wc的)以及这里那里 #include <iostream> #include <cstdio> using namespace std; ...

  5. 【刷题】LOJ 2587 「APIO2018」铁人两项

    题目描述 比特镇的路网由 \(m\) 条双向道路连接的 \(n\) 个交叉路口组成. 最近,比特镇获得了一场铁人两项锦标赛的主办权.这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行车完成第二段 ...

  6. LOJ #2587「APIO2018」铁人两项

    是不是$ vector$存图非常慢啊...... 题意:求数对$(x,y,z)$的数量使得存在一条$x$到$z$的路径上经过$y$,要求$x,y,z$两两不同  LOJ #2587 $ Solutio ...

  7. 【LOJ】#2587. 「APIO2018」铁人两项

    题解 学习了圆方树!(其实是复习了Tarjan求点双) 我又双叒叕忘记了tarjan点双一个最重要,最重要的事情! 就是--假如low[v] >= dfn[u],我们就找到了一个点双,开始建立方 ...

  8. [APIO2018]铁人两项 --- 圆方树

     [APIO2018] 铁人两项 题目大意: 给定一张图,问有多少三元组(a,b,c)(a,b,c 互不相等)满足存在一条点不重复的以a为起点,经过b,终点为c的路径 如果你不会圆方树 ------- ...

  9. [APIO2018]铁人两项 [圆方树模板]

    把这个图缩成圆方树,把方点的权值设成-1,圆点的权值设成点双的size,算 经过这个点的路径的数量*这个点的点权 的和即是答案. #include <iostream> #include ...

随机推荐

  1. 用户ID与权限

    目录 用户ID与权限 文件系统查看 权限ID概览 设置位 黏着位 UMASK chmod与chown 代码附录 chmod title: 用户ID与权限 date: 2019/11/25 21:20: ...

  2. 生产环境中的 redis 是怎么部署的

    redis cluster,10 台机器,5 台机器部署了 redis 主实例,另外 5 台机器部署了 redis 的从实例,每个主实例挂了一个从实例,5 个节点对外提供读写服务,每个节点的读写高峰q ...

  3. String类基础的那些事!

    第三阶段 JAVA常见对象的学习 第一章 常见对象--String类 (一) String 类的概述及其构造方法 (1) 概述 多个字符组成的一串数据,例如 "abc" 也可以看成 ...

  4. Javascript性能优化阅读笔记

    第一章 加载和执行 大多数浏览器都是用单一进程处理UI界面的刷新和JavaScript的脚本执行,所以同一时间只能做一件事,Javascript执行过程耗时越久,浏览器等待响应的时间就越长. 所以,H ...

  5. idea配置glassFish启动项目

    将项目打成war包形式. 然后配置glassFish +号配置启动包 此处配置启动路径 ........ 路径也可以在localhost:4848 --->中的Applicaton中去配置

  6. S03_CH03_AXI_DMA_OV7725摄像头采集系统

    S03_CH03_AXI_DMA_OV7725摄像头采集系统 3.1概述 本课程讲解如何搭建基于DMA的图形系统,方案原理如下. 摄像头采样图像数据后通过DMA送入到DDR,在PS部分产生DMA接收中 ...

  7. MongoDB实战读书笔记(二):面向文档的数据

    1 schema设计原则 1.1 关系型数据库的三大设计范式 第一范式(1NF)无重复的列 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ] 第三范式(3NF)属性不依赖于其它非主属性 ...

  8. Task资料

    5天玩转C#并行和多线程编程:http://www.cnblogs.com/yunfeifei/p/3993401.html

  9. html中正则匹配img

    1.正则匹配html中的img标签,取出img的url并进行图片文件下载: /// <summary> /// 将image标签的src属性的url替换为base64 /// </s ...

  10. TypeScript入门五:TypeScript的接口

    TypeScript接口的基本使用 TypeScript函数类型接口 TypeScript可索引类型接口 TypeScript类类型接口 TypeScript接口与继承 一.TypeScript接口的 ...