当前位置:网站首页>【模板】【luogu P4630】Duathlon 铁人两项(圆方树)
【模板】【luogu P4630】Duathlon 铁人两项(圆方树)
2022-07-04 15:18:00 【SSL_TJH】
Duathlon 铁人两项
题目链接:luogu P4630
题目大意
给你一个无向图,然后你可以按顺序选三个点 a,b,c,保证 a 可以到 b,b 可以到 c,而且存在方案使得这两个路径的交点只有 b。
然后问你有多少个满足的三元组。
思路
首先如果这个是森林的话那我们可以很好的搞。
(反正各种方法随便你)
那我们现在是一个图,那就不好搞了。
那我们考虑能不能把它变成树?于是就可以用圆方树了。
圆方树
在讲圆方树之前,让我们先给出一些定义:
点双连通图
如果是有向图,就有一个强连通图。那无向图就会有一个点双连通图和一个边双连通图。
边双连通子图这里没用到就不说了,我们给出点双连通的子图的定义:图中任意两不同点之间都有至少两条点不重复的路径。
(因为一个点的比较不好搞所以我们默认没有孤立点,如果题目中有就按照题目要求特殊处理)
然后你会发现有一个近似等价的定义是不存在割点的图。
发现反例只有两个点一条边的情况(或者你也可以认为不是反例,因为你起点终点一定要重复的)
点双连通分量
跟强连通分量一样,就是一个图的极大点双连通子图。
但是你如果画个图你不难发现就是一个点是可能在若干个点双中的,但是一个边只会在一个中。
圆方树
那在圆方树中,我们把原来的点看做原点,每个点双对应一个方点。
(不难看出方点数量最多为 n n n,所以记得总共要开 2 n 2n 2n)
然后一个方点向它点双里面的点(原点)连边。
然后这个图就变成了若干格菊花,每个菊花通过原图的割点连接起来。
然后你不难想象任意一套树上路径都是圆方点交错的。
建
考虑用类似 Tarjan 的方法。
那因为无向图,所以我们找到新点的时候更新 l o w low low 是跟 l o w low low 更新,找到原来的点的时候就要跟 d f n dfn dfn 更新。
那你会发现也是找环的顶端,那条件就是 d f n u = l o w x dfn_u=low_x dfnu=lowx(然后 u u u 就是最顶端)
然后你就可以建出来了。
这道题
那如果是树上的很好搞,我们考虑把环通过圆方树弄成树,然后看看方点那边要怎么处理。
然后我们其实会发现你一个点双里面任意两个点之间,对于其他的每个点都有一种方法可以走过。
(小小证明就是你可以把这个点双拉成一个环,然后就没啦)
然后你就发现如果你要经过一个方点,你里面的点都可以经过,那我们可以把方点的权值赋做它点双的大小,然后路径上的方点的权值和就是固定了 s , f s,f s,f 满足条件的 c c c 的个数。
然后你发现你算重了,因为相邻的两个方点之间是通过点连接起来的,所以每个点其实都会充当一个连接的位置,所以我们要把点的权值弄成 − 1 -1 −1。
然后这里是要求所有的,我们就小小树形 DP 一下,考虑每个点对所有包含他的路径的贡献即可。
(子树内部,子树和外面)
代码
#include<cstdio>
#include<vector>
#include<iostream>
#define ll long long
using namespace std;
const int N = 1e5 + 100;
int n, m;
vector <int> G[N];
struct YF_tree {
int dfn[N], low[N], sta[N], tot, deg[N << 1], fa[N << 1][21];
int val[N << 1], num, sz[N << 1];
vector <int> GG[N << 1];
ll ans;
void link(int x, int y) {
GG[x].push_back(y); GG[y].push_back(x);
}
void tarjan(int now) {
dfn[now] = low[now] = ++dfn[0]; sta[++sta[0]] = now; num++;
for (int i = 0; i < G[now].size(); i++) {
int x = G[now][i];
if (!dfn[x]) {
tarjan(x); low[now] = min(low[now], low[x]);
if (dfn[now] == low[x]) {
tot++;
while (sta[sta[0]] != x) {
link(sta[sta[0]], tot);
sta[0]--; val[tot]++;
}
link(sta[sta[0]], tot); sta[0]--; val[tot]++;
link(now, tot); val[tot]++;
}
}
else low[now] = min(low[now], dfn[x]);
}
}
void dfs(int now, int father) {
if (now <= n) sz[now] = 1;
for (int i = 0; i < GG[now].size(); i++) {
int x = GG[now][i];
if (x != father) {
dfs(x, now);
ans += 2ll * sz[now] * sz[x] * val[now];
sz[now] += sz[x];
}
}
ans += 2ll * sz[now] * (num - sz[now]) * val[now];
}
void Init() {
tot = n; for (int i = 1; i <= n; i++) val[i] = -1;
for (int i = 1; i <= n; i++) if (!dfn[i]) num = 0, tarjan(i), dfs(i, 0);
}
}T;
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
int x, y; scanf("%d %d", &x, &y);
G[x].push_back(y); G[y].push_back(x);
}
T.Init();
printf("%lld", T.ans);
return 0;
}
边栏推荐
- 周大福践行「百周年承诺」,真诚服务推动绿色环保
- Research Report on market supply and demand and strategy of China's Sodium Tetraphenylborate (cas+143-66-8) industry
- 智慧物流园区供应链管理系统解决方案:数智化供应链赋能物流运输行业供应链新模式
- Which domestic cloud management platform manufacturer is good in 2022? Why?
- Understand asp Net core - Authentication Based on jwtbearer
- The winning rate against people is 84%, and deepmind AI has reached the level of human experts in army chess for the first time
- How to implicitly pass values when transferring forms
- 中银证券网上开户安全吗?
- 【Go ~ 0到1 】 第六天 文件的读写与创建
- Sql实现Split
猜你喜欢
建筑建材行业经销商协同系统解决方案:赋能企业构建核心竞争力
GO开发:如何利用Go单例模式保障流媒体高并发的安全性?
How can programmers improve the speed of code writing?
2022年国内云管平台厂商哪家好?为什么?
昆明三环闭合工程将经过这些地方,有在你家附近的吗?
【云原生】服务网格是什么“格”?
2022PMP考试基本情况详情了解
Understand ThreadLocal in one picture
Analysis of abnormal frequency of minor GC in container environment
周大福践行「百周年承诺」,真诚服务推动绿色环保
随机推荐
Hair and fuzz interceptor Industry Research Report - market status analysis and development prospect forecast
高度剩余法
Research Report on market supply and demand and strategy of China's Sodium Tetraphenylborate (cas+143-66-8) industry
科普达人丨一文看懂阿里云的秘密武器“神龙架构”
Integration of ongdb graph database and spark
周大福践行「百周年承诺」,真诚服务推动绿色环保
c# 实现定义一套中间SQL可以跨库执行的SQL语句
How to "use" Perl modules in directories that are not in @inc- How do I 'use' a Perl module in a directory not in @INC?
China Indonesia adhesive market trend report, technological innovation and market forecast
Overflow: the combination of auto and Felx
Inside and outside: flow chart drawing elementary: six common mistakes
System.currentTimeMillis() 和 System.nanoTime() 哪个更快?别用错了!
Is it safe to open an account online
Go development: how to use go singleton mode to ensure the security of high concurrency of streaming media?
ECCV 2022放榜了:1629篇论文中选,录用率不到20%
js中的数组筛选fliter
【云原生】服务网格是什么“格”?
安信证券手机版下载 网上开户安全吗
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(2)-初识Fiddler让你理性认识一下
Hair growth shampoo industry Research Report - market status analysis and development prospect forecast