题目

题目描述

比特镇的路网由 mm 条双向道路连接的 nn 个交叉路口组成。

最近,比特镇获得了一场铁人两项锦标赛的主办权。这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行车完成第二段赛程。

比赛的路线要按照如下方法规划:

先选择三个两两互不相同的路口 s,cs, cff,分别作为比赛的起点、切换点(运动员在长跑到达这个点后,骑自行车前往终点)、终点。
选择一条从 ss 出发,经过 cc 最终到达 ff 的路径。考虑到安全因素,选择的路径经过同一个点至多一次。
在规划路径之前,镇长想请你帮忙计算,总共有多少种不同的选取 s,cs, cff 的方案,使得在第 22 步中至少能设计出一条满足要求的路径。

输入格式

第一行包含两个整数 nnmm ,分别表示交叉路口和双向道路的数量。

接下来 mm 行,每行两个整数 vi,uiv_i, u_i。表示存在一条双向道路连接交叉路口 vi,ui(1vi,uin,viui)v_i, u_i\:(1 ≤ v_i, u_i ≤ n,v_i \neq u_i)

保证任意两个交叉路口之间,至多被一条双向道路直接连接。

输出格式

输出一行,包括一个整数,表示能满足要求的不同的选取 s,cs, cff 的方案数。

输入输出样例

输入 #1
4 3
1 2
2 3
3 4
输出 #1
8

输入 #2
4 4
1 2
2 3
3 4
4 2
输出 #2
14

说明/提示

提示

在第一个样例中,有以下 88 种不同的选择 (s,c,f)(s,c,f) 的方案:(1,2,3),(1,2,4),(1,3,4),(2,3,4),(3,2,1),(4,2,1),(4,3,1),(4,3,2)(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4),(3, 2, 1), (4, 2, 1), (4, 3, 1), (4, 3, 2)

在第二个样例中,有以下 1414 种不同的选择 (s,c,f)(s, c, f) 的方案:(1,2,3),(1,2,4),(1,3,4),(1,4,3),(2,3,4),(2,4,3),(3,2,1),(3,2,4),(3,4,1),(3,4,2),(4,2,1),(4,2,3),(4,3,1),(4,3,2)(1, 2, 3), (1, 2, 4), (1, 3, 4), (1, 4, 3), (2, 3, 4), (2, 4, 3),(3,2,1),(3,2,4),(3,4,1),(3,4,2), (4, 2, 1), (4, 2, 3), (4, 3, 1), (4, 3, 2)

子任务(注:这里给出的子任务与本题在这里的最终评测无关,仅供参考)

Subtask 1 (points: 55): n10,m100n \leq 10, m \leq 100
Subtask 2 (points: 1111): n50,m100n \leq 50, m \leq 100
Subtask 3 (points: 88): n100000n \leq 100000,每个交叉路口至多作为两条双向道路的端点
Subtask 4 (points: 1010): n1000n \leq 1000,在路网中不存在环(存在环是指存在一个长度为 k(k3)k (k ≥ 3) 的交叉路口序列 v1,v2,...,vkv_1, v_2,..., v_k,序列中的路口编号两两不同,且对于 ii11k1k−1,有一条双向道路直接连接路口 viv_ivi+1v_{i+1},且有一条双向道路直接连接路口 vkv_kv1v_1
Subtask 5(points: 1313): n100000n \leq 100000,在路网中不存在环
Subtask 6(points: 1515): n1000n \leq 1000,对于每个交叉路口,至多被一个环包含
Subtask 7(points: 2020): n100000n \leq 100000,对于每个交叉路口,至多被一个环包含
Subtask 8(points: 88): n1000,m2000n \leq 1000, m \leq 2000
Subtask 9(points: 1010): n100000,m200000n \leq 100000, m \leq 200000

思路

对于无向图上的简单路径问题,一般我们会试用 tarjantarjan 这个优(gui)秀(chu)的东西。
对于这一题,我们需要先将每一个点双联通分量缩起来。
于是解引出了我国庆集训刚学习的 毒瘤 东西:
——圆方树
会圆方树的奆佬们请自觉忽略以下文字。

圆方树

对于圆方树这个东西,我想贴一张图:
【Luogu 4630】[APIO2018] Duathlon 铁人两项(圆方树)
………………………………………


定义

在圆方树中,原来的每个点对应一个圆点,每一个点双对应一个方点。
所以共有 n+cn+c 个点,其中 nn 是原图点数,cc 是原图点双连通分量的个数。
造一颗圆方树,就可以支持一些对无向图路径的操作了。
聪明机智 的我又开始 盗图 了。
【Luogu 4630】[APIO2018] Duathlon 铁人两项(圆方树)
(不要face的把图片下面的网址改成了红色。。。)

性质

有一些 显而易见 的性质:

  • 对于任意无向图 G={V,E}G=\{V , E\} 均满足建出来的是森林。
  • 对于任意连通无向图 GG 均满足建出来的是一颗无根树。
  • 方点只能和圆点相邻,同样,圆点只能和方点相邻。
  • 如果两个方点有公共相邻的圆点,那这个圆点就是这两个方点代表的点双的割点。
  • 原图的割点是圆方树中度数 >1>1 的圆点。
  • 方点的点度是点双联通分量的大小。
  • 我不知道(编不下去)了……
构建

似乎很简单?
首先 TarjanTarjan 缩点,把每个大小超过 11 的环里面的所有点都向一个新点(方点)连边。
然后把多出来的连接两个圆点的边直接给连上。
就完事了。。。


那么这题怎么做呢?
这好像就是一道圆方树裸题。
具体见下:

  • 把圆方树建出来,在树中任意枚举两个圆点作为 ssff ,然后考虑 cc 有多少种选法,两个点路径上每个点双中的点都可以选。
  • 令每个圆点的权值为1−1,每个方点的权值为点双大小,可以得到答案就是两点之间的点权和,也就是说我们要求圆方树上 n2n^2 条圆点到圆点的路径的权值和。
  • 可以想到计算每个点被算了多少次,可以用一遍dfsdfs得到。这样就可以在线性的时间内做完这题了。????

代码

……(待更)(其实就是不会)

相关文章: