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

在本题中,方点点权赋值为该点双的大小,因为两个点双最多有一个交点,将圆点赋为-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. Windows 安装 Linux 环境

    简介 在实际开发中,我们除了在Windows上进行开发外,可能还需要基于Linux进行一些编译或者测试等,因此,我们可能需要在Windows环境中安装Linux环境,通常可能我们会使用虚拟机替代,但是 ...

  2. 云存储?不依赖三方服务自己也可以搞,利用Docker来搭建分布式文件系统FastDfs

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_78 对于文件存储来说,一般情况下简单的处理就是在Django配置文件中配置存储目录,按照规则对文件进行上传或者下载. 实际上,当文 ...

  3. ADB命令用法大全

    ​ 一.ADB简介 Android Debug Bridge,安卓调试桥,它借助adb.exe(Android SDK安装目录platform-tools下),用于电脑端与模拟器或者真实设备交互:使用 ...

  4. 操作系统学习笔记4 | CPU管理 && 多进程图像

    操作系统的核心功能就是管理计算机硬件,而CPU就是计算机中最核心的硬件.而通过学习笔记3的简史回顾,操作系统通过多进程图像实现对CPU的管理.所以多进程图像是操作系统的核心图像. 参考资料: 课程:哈 ...

  5. Word 常识备忘录

    一句科普 名词解释 左右页边距 正文到纸左右两边之间的间距. 分页符 分页符是分页的一种符号,上一页结束以及下一页开始的位置. 分栏符 分栏的页面使用分栏符可以使一列分栏的段落排列到另一栏. 邮件合并 ...

  6. numa 自动balance 的bug分析

    关于migrate_swap() 和 active_balance()之间的hardlock 背景:这个是在3.10.0-957.el7.x86_64 遇到的一例crash 下面列一下我们是怎么排查并 ...

  7. B/S结构通信系统原理

    本文介绍JavaWeb的B/S结构通信原理 概念:        Javaweb中B/S架构是一种系统架构形式,这里的B是Browser(浏览器),S是Server(服务器),是一种系统的架构形式,有 ...

  8. KingbaseES R3 集群一键修改集群用户密码案例

    案例说明: 在KingbaseES R3集群的最新版本中增加了kingbase_monitor.sh一键修改集群用户密码的功能,本案例是对此功能的测试. kingbaseES R3集群一键修改密码说明 ...

  9. KingbaseES R3集群在线删除数据节点案例

    案例说明: kingbaseES R3集群一主多从的架构,一般有两个节点是集群的管理节点,所有的节点都可以为数据节点:对于非管理节点的数据节点可以在线删除:但是对于管理节点,无法在线删除,如果删除管理 ...

  10. 1.关于433MHz按键单片机解码

    近段时间做项目要用到单片机接收433MHz按键发过来的码值,涉及短按.连按.长按,由于之前没有做过这方面一开始有点蒙,找遍网上都没有案例,现在项目完成了整理自己的一些心得和大家分享分享!!!直入主题. ...