圆方树大致理解:将每个点双看做一个新建的点(方点),该点双内的所有点(圆点)都向新建的点连边,最后形成一棵树,可以给点赋予点权,用以解决相关路径问题。

在本题中,方点点权赋值为该点双的大小,因为两个点双最多有一个交点,将圆点赋为-1来去重,先用tarjan()构建出圆方树,在跑一遍dfs,dfs枚举的是作为c的点,维护sz2[ ](圆点个数,因为s和f只能是圆点),利用乘法原理累加答案即可。

注意代码中累加答案是要乘2,(s和f可以交换)。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=500010;
4 typedef long long ll;
5
6 struct node{
7 int head[N],nxt[N<<1],to[N<<1],tot;
8 void add(int u,int v){
9 nxt[++tot]=head[u];head[u]=tot;to[tot]=v;
10 nxt[++tot]=head[v];head[v]=tot;to[tot]=u;
11 }
12 }G1,G2;
13 int dfn[N],low[N],st[N],sz[N],top,idx,tot,n,m,t1,t2,sznow;
14 //sznow存树中圆点个数
15 void tarjan(int u){//建立圆方树
16 sz[u]=-1;++sznow;
17 dfn[u]=low[u]=++tot;
18 st[++top]=u;//入栈
19 for(int i=G1.head[u];i;i=G1.nxt[i]){
20 if(!dfn[G1.to[i]]){
21 tarjan(G1.to[i]);
22 low[u]=min(low[u],low[G1.to[i]]);
23 if(dfn[u]<=low[G1.to[i]]){
24 ++idx;
25 int v;
26 do{
27 v=st[top--];
28 G2.add(v,idx);
29 ++sz[idx];
30 }while(v!=G1.to[i]);
31 ++sz[idx];
32 G2.add(u,idx);
33 //将该点双看做一个点,内部的点向该点连边
34 }
35 }
36 else low[u]=min(low[u],dfn[G1.to[i]]);
37 }
38 }
39
40 ll ans;
41 int sz2[N];
42
43 void dfs(int u,int fa){
44 sz2[u]=u<=n; //只有圆点才可作为s或f,c在圆点方点都行
45 for(int i=G2.head[u],v;i;i=G2.nxt[i]){
46 if((v=G2.to[i])!=fa){//计算子树两两积
47 dfs(v,u);
48 ans+=2ll*sz2[u]*sz2[v]*sz[u];
49 sz2[u]+=sz2[v];
50 }
51 }
52 ans+=2ll*sz2[u]*(sznow-sz2[u])*sz[u];
53 }
54
55 int main(){
56 scanf("%d%d",&n,&m);
57 idx=n;
58 for(int i=1;i<=m;i++){
59 scanf("%d%d",&t1,&t2);
60 G1.add(t1,t2);
61 }
62 for(int i=1;i<=n;i++){
63 if(!dfn[i]){//对于每个连通块都要先清空
64 sznow=0;
65 top=0;
66 tarjan(i);
67 dfs(i,0);
68 }
69 }
70 printf("%lld\n",ans);
71 }

洛谷P4630 [APIO2018] Duathlon 铁人两项 (圆方树)的更多相关文章

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

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

  2. 洛谷P4630 [APIO2018] Duathlon 铁人两项 【圆方树】

    题目链接 洛谷P4630 题解 看了一下部分分,觉得树的部分很可做,就相当于求一个点对路径长之和的东西,考虑一下能不能转化到一般图来? 一般图要转为树,就使用圆方树呗 思考一下发现,两点之间经过的点双 ...

  3. [洛谷P4630][APIO2018] Duathlon 铁人两项

    题目大意:给一张无向图,求三元组$(u,v,w)$满足$u->v->w$为简单路径,求个数 题解:圆方树,缩点后$DP$,因为同一个点双中的点一定地位相同 卡点:1.$father$数组开 ...

  4. 【Luogu4630】【APIO2018】 Duathlon 铁人两项 (圆方树)

    Description ​ 给你一张\(~n~\)个点\(~m~\)条边的无向图,求有多少个三元组\(~(x, ~y, ~z)~\)满足存在一条从\(~x~\)到\(~z~\)并且经过\(~y~\)的 ...

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

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

  6. loj2587 「APIO2018」铁人两项[圆方树+树形DP]

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

  7. 洛谷P4630 铁人两项--圆方树

    一道很好的圆方树入门题 感谢PinkRabbit巨佬的博客,讲的太好啦 首先是构建圆方树的代码,也比较好想好记 void tarjan(int u) { dfn[u] = low[u] = ++dfn ...

  8. P4630 [APIO2018] Duathlon 铁人两项

    思路 圆方树,一个点双中的所有点都可以被经过,所以给圆点赋值-1,方点赋值为圆点个数,统计圆点两两之间的路径权值和即可 代码 #include <cstdio> #include < ...

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

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

随机推荐

  1. MyBatis-Plus联表查询的短板,终于有一款工具补齐了

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的 ...

  2. MySQL建表DDL规范(欢迎补充)

    MySQL建表DDL规范(欢迎补充) 基本规范: 表名和字段名全大写,一般表名以T开头 脚本需支持可重复执行,带IF NOT EXISTS ,但不可带DROP语句 字符集使用utf8mb4 (CHAR ...

  3. BI报表与数据开发

    先贴个不好看的图让内容好看一点,也顺便说一下数据处理的流程:收集数据,数据清洗与数据加工,数据展示 报表制作一般就是前面的开发兄弟们完成然后把数据交到报表的兄弟们,然后在根据领导要求制作报表.大概就是 ...

  4. 智慧文旅IOC大数据可视化建设方案

    一.建设背景 自2020年以来,疫情对各行各业的都造成了不同程度的影响,对依赖人口消费实现商业价值的文旅行业更是受到了更大的冲击,因此在疫情当下以及科技发达的今天,如何利用科技的手段赋能文旅行业进行数 ...

  5. 大数据开发,Hadoop Spark太重?你试试esProc SPL

    摘要:由于目标和现实的错位,对很多用户来讲,Hadoop成了一个在技术.应用和成本上都很沉重的产品. 本文分享自华为云社区<Hadoop Spark太重,esProc SPL很轻>,作者: ...

  6. 6. MGR状态监控 | 深入浅出MGR

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 节点状态监控 2. MGR事务状态监控 3. 其他监控 4. 小结 参考资料.文档 免责声明 文章推荐: 关于 ...

  7. Tracer类定义

    这个类主要是用于检测光线是否穿过球体.是核心,所有的碰撞都继承于这个类,书上也阐述了很多.详细就看书. 类定义: #pragma once #ifndef __TRACER_HEADER__ #def ...

  8. Spring源码 20 手写模拟源码

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

  9. Spring核心思想Ioc和Aop (面试)

    Spring核心思想Ioc和Aop (面试) 注意: Ioc和Aop并不是Spring提出的,在Spring之前就已经存在,Spring只是在技术层面给这两个思想做了非常好的实现. 1 Ioc 1.1 ...

  10. 树莓派4B无屏幕连接Wi-Fi/启用ssh/创建用户

    前边总得说点什么 最近每次在Win10上写代码需要启动Redis,残血Redis For Windows有卡死系统的bug.由于主机内存不大够用(已经扩到顶了),开虚拟机运行Redis更别提了..想起 ...