无向图,图中选出定点三元组(a,b,c),a->b->c的路径没有重复边。问方案有多少?

————————————————————————————————————————————

首先求出圆方树,方点权值为连接的圆点数量,圆点权值为-1

这时,枚举a,c点,b点的方案数为a,c路径上的点权和。

枚举a,c点然后计算点权和明显超时。于是我们枚举b点,计算通过它的方案数。

所以神搜后有三种可能,b点的各个子分支与其它点,b点的向上分支与其它点,如果b点为a或c点的情况

————————————————————————————————————————————

 1 #include <bits/stdc++.h>
2 using namespace std;
3 const int maxn = 2e5 + 10, maxm = 8e5 + 10;
4 int n, m, cnt;
5 struct edge {
6 int u, v, nxt;
7 } e[maxm], ee[maxm];
8 int head[maxn], js, headd[maxn], jss;
9 void addage(int u, int v) {
10 e[++js].u = u;
11 e[js].v = v;
12 e[js].nxt = head[u];
13 head[u] = js;
14 }
15 void addagee(int u, int v) {
16 ee[++jss].u = u;
17 ee[jss].v = v;
18 ee[jss].nxt = headd[u];
19 headd[u] = jss;
20 }
21 int dfn[maxn], low[maxn], tim, sta[maxn], top, pw[maxn];
22 int sum, siz[maxn];
23 bool vis[maxn];
24 void tarjan(int u, int fa) {
25 dfn[u] = low[u] = ++tim;
26 sta[++top] = u;
27 for (int i = head[u]; i; i = e[i].nxt) {
28 int v = e[i].v;
29 if (!dfn[v]) {
30 tarjan(v, u);
31 low[u] = min(low[v], low[u]);
32 if (low[v] >= dfn[u]) {
33 cnt++;
34 int tp = 0;
35 while (tp != v) {
36 tp = sta[top--];
37 addagee(cnt, tp);
38 addagee(tp, cnt);
39 pw[cnt]++;
40 pw[tp] = -1;
41 }
42 addagee(cnt, u);
43 addagee(u, cnt);
44 pw[cnt]++;
45 pw[u] = -1;
46 }
47 } else if (v != fa)
48 low[u] = min(low[u], dfn[v]);
49 }
50 }
51 long long ans;
52 void dfs1(int u, int fa) {
53 vis[u] = 1;
54 siz[u] = (u <= n);
55 for (int i = headd[u]; i; i = ee[i].nxt) {
56 int v = ee[i].v;
57 if (v == fa)
58 continue;
59 dfs1(v, u);
60 siz[u] += siz[v];
61 }
62 }
63 void dfs2(int u, int fa) {
64 for (int i = headd[u]; i; i = ee[i].nxt) {
65 int v = ee[i].v;
66 if (v == fa)
67 continue;
68 dfs2(v, u);
69 ans += (long long)pw[u] * (sum - siz[v]) * siz[v]; // u的每一个子分支与其它点的
70 }
71 ans += (long long)pw[u] * (sum - siz[u]) * siz[u]; // u向上的分支与其它的点
72 if (u <= n)
73 ans += (long long)pw[u] * (sum - 1); // u作为端点
74 }
75 int main() {
76 scanf("%d%d", &n, &m);
77 for (int u, v, i = 0; i < m; ++i) {
78 scanf("%d%d", &u, &v);
79 addage(u, v);
80 addage(v, u);
81 }
82 cnt = n;
83 for (int i = 1; i <= n; ++i)
84 if (!dfn[i])
85 tarjan(i, 0);
86 for (int i = 1; i <= n; ++i)
87 if (!vis[i]) {
88 dfs1(i, 0);
89 sum = siz[i];
90 dfs2(i, 0);
91 }
92 cout << ans;
93
94 return 0;
95 }

loj2587铁人两项的更多相关文章

  1. 【APIO2018】铁人两项

    [APIO2018]铁人两项 题目描述 大意就是给定一张无向图,询问三元组\((s,c,f)\)中满足\(s\neq c\neq f\)且存在\((s\to c\to f)\)的简单路径(每个点最多经 ...

  2. 【APIO2018】铁人两项(圆方树,动态规划)

    [APIO2018]铁人两项(圆方树,动态规划) 题面 UOJ 洛谷 BZOJ 题解 嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到 首先一棵树是很容易做的,随意指定起点终点就 ...

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

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

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

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

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

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

  6. [Luogu4630][APIO2018]Duathlon 铁人两项

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

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

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

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

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

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

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

随机推荐

  1. sql将两个查询结果拼接到一块,去掉重复,动态sql

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...

  2. ArrayList哪种遍历效率最好,你真的弄明白了吗?

    ArrayList简介 声明:以下内容都是基于jdk1.8的 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了 ...

  3. C# 9 新特性——init only setter

    C# 9 新特性--init only setter Intro C# 9 中新支持了 init 关键字,这是一个特殊的 setter,用来指定只能在对象初始化的时候进行赋值,另外支持构造器简化的写法 ...

  4. 重温Java JDK安装,希望帮助更多的学习在路上的小白

    JDK卸载和安装 现在JDK已经升级到JDK11版本了,但是JDK1.8(JDK8)仍然有很多小伙伴在使用,这里也记录一下jdk1.8的下载及安装过程,对于刚学习java的小伙伴可以参考,熟手可忽略, ...

  5. WPF Line 的颜色过度动画

    <Line Grid.Column="2" Grid.ColumnSpan="2" VerticalAlignment="Center" ...

  6. 免费、开源的基于tp5的快速开发框架

    HisiPHP 系统官网:https://www.hisiphp.com/ 后台体验:http://v2.demo.hisiphp.com/admin.php/system/publics/index ...

  7. 天梯赛练习 L3-007 天梯地图 (30分) Dijkstra

    题目分析: 本题的题意比较清晰,就是有一个起点和一个终点,给出m条路径,可能是单向的可能是双向的,同时一条路有两个权重,分别是通过这条路需要的时间和这条路的路径长度,题目需要求出两条路径,一条是在最快 ...

  8. Ansible User 模块添加单用户并ssh-key复制

    Ansible User 模块添加单用户并ssh-key复制 1 Ansible 版本: ansible 2.9.6 config file = /etc/ansible/ansible.cfg co ...

  9. Netty入门一:服务端应用搭建 & 启动过程源码分析

    最近周末也没啥事就学学Netty,同时打算写一些博客记录一下(写的过程理解更加深刻了) 本文主要从三个方法来呈现:Netty核心组件简介.Netty服务端创建.Netty启动过程源码分析 如果你对Ne ...

  10. python学习笔记 | 顺序表的常规操作

    ''' @author: 人人都爱小雀斑 @time: 2020/3/11 8:46 @desc: 顺序表的相关操作 ''' class SequenceList: def __init__(self ...