标题已经告诉你怎么做了.....

两点间的圆点个数即为所求

建出圆方树后打个树剖求$lca$就行.....

复杂度$O(n + q \log n)$

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} int wr[], rw;
#define pc(o) *O ++ = o
char WR[], *O = WR;
inline void write(int x) {
if(!x) pc('');
if(x < ) pc('-'), x = -x;
while(x) wr[++ rw] = x % , x /= ;
while(rw) pc(wr[rw --] + ''); pc('\n');
} #define ri register int
#define sid 500050
#define nid 1005000
#define eid 4005000 int n, m, cnp;
int cap[sid], aap[nid], nxt[eid], node[eid]; inline void cop(int u, int v) { nxt[++ cnp] = cap[u]; cap[u] = cnp; node[cnp] = v; }
inline void bop(int u, int v) { nxt[++ cnp] = aap[u]; aap[u] = cnp; node[cnp] = v; } int st[sid], snp, scc;
int dfn[sid], low[sid], dfn_id; #define cur node[i] void tarjan(int o) {
st[++ snp] = o;
dfn[o] = low[o] = ++ dfn_id;
for(int i = cap[o]; i; i = nxt[i])
if(!dfn[cur]) {
tarjan(cur); low[o] = min(low[o], low[cur]);
if(low[cur] < dfn[o]) continue;
int e; ++ scc; bop(o, scc);
do { e = st[snp --]; bop(scc, e); } while(e != cur);
}
else low[o] = min(low[o], dfn[cur]);
} int anc[nid], fa[nid], sz[nid];
int dep[nid], de[nid], son[nid]; void dfs(int o) {
sz[o] = ; de[o] = de[fa[o]] + (o <= n);
for(int i = aap[o]; i; i = nxt[i])
if(cur != fa[o]) {
dep[cur] = dep[o] + ; fa[cur] = o;
dfs(cur); sz[o] += sz[cur];
if(sz[son[o]] < sz[cur]) son[o] = cur;
}
} void dfs(int o, int tp) {
anc[o] = tp; if(!son[o]) return; dfs(son[o], tp);
for(int i = aap[o]; i; i = nxt[i])
if(cur != fa[o] && cur != son[o]) dfs(cur, cur);
} int lca(int u, int v) {
int pu = anc[u], pv = anc[v];
while(pu != pv) {
if(dep[pu] < dep[pv]) swap(u, v), swap(pu, pv);
u = fa[pu]; pu = anc[u];
}
return (dep[u] < dep[v]) ? u : v;
} int main() {
scc = n = read(); m = read();
for(ri i = ; i <= m; i ++) {
int u = read(), v = read();
cop(u, v); cop(v, u);
}
tarjan(); dfs(); dfs(, );
int q = read();
for(ri i = ; i <= q; i ++) {
int u = read(), v = read(), o = lca(u, v);
write(de[u] + de[v] - de[o] - de[fa[o]]);
}
fwrite(WR, , O - WR, stdout);
return ;
}

luoguP4320 道路相遇 圆方树的更多相关文章

  1. 【luogu4320】道路相遇 (圆方树 + LCA)

    Description ​ 给你一张\(~n~\)个点\(~m~\)条边的无向图,保证无重边无自环, 共\(~q~\)组询问求\(~x~\)到\(~y~\)的路径上必经的点数. Solution ​ ...

  2. 【洛谷 P4320】 道路相遇 (圆方树,LCA)

    题目链接 题意:给一张无向图和\(M\)个询问,问\(u,v\)之间的路径的必经之点的个数. 对图建出圆方树,然后必经之点就是两点路径经过的原点个数,用\((dep[u]+dep[v]-dep[LCA ...

  3. P4320-道路相遇,P5058-[ZJOI2004]嗅探器【圆方树,LCA】

    两题差不多就一起写了 P4320-道路相遇 题目链接:https://www.luogu.com.cn/problem/P4320 题目大意 \(n\)个点\(m\)条边的一张图,\(q\)次询问两个 ...

  4. 图论杂项细节梳理&模板(虚树,圆方树,仙人掌,欧拉路径,还有。。。)

    orzYCB 虚树 %自为风月马前卒巨佬% 用于优化一类树形DP问题. 当状态转移只和树中的某些关键点有关的时候,我们把这些点和它们两两之间的LCA弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. ...

  5. 仙人掌&圆方树

    仙人掌&圆方树 Tags:图论 [x] [luogu4320]道路相遇 https://www.luogu.org/problemnew/show/P4320 [ ] [SDOI2018]战略 ...

  6. [SDOI2018]战略游戏 圆方树,树链剖分

    [SDOI2018]战略游戏 这题是道路相遇(题解)的升级版,询问的两个点变成了\(S\)个点. LG传送门 还是先建出圆方树,考虑对于询问的\(S\)个点,答案就是圆方树上能包含这些点的最小连通块中 ...

  7. Note -「圆方树」学习笔记

    目录 圆方树的定义 圆方树的构造 实现 细节 圆方树的运用 「BZOJ 3331」压力 「洛谷 P4320」道路相遇 「APIO 2018」「洛谷 P4630」铁人两项 「CF 487E」Touris ...

  8. BZOJ5329:[SDOI2018]战略游戏(圆方树,虚树)

    Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着 ...

  9. 【BZOJ5329】【SDOI2018】战略游戏(圆方树,虚树)

    [BZOJ5329][SDOI2018]战略游戏(圆方树,虚树) 题面 BZOJ 洛谷 Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战 ...

随机推荐

  1. 【leetcode 简单】第十八题 爬楼梯

    假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两 ...

  2. 大聊PYthon----生成器

    再说迭代器与生成器之前,先说一说列表生成式 列表生成式 什么是列表生成式呢? 这个非常简单! 先看看普通青年版的! >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, ...

  3. php菜刀分析学习

    这里以eval为例 我们知道, php中的eval能把字符串当代码执行: eval('phpcode'); 注意, 这里的代码要有分号结尾, 我们测试: 我们创建一个最简单的SHELL: <?p ...

  4. xv6/bootasm.S + xv6/bootmain.c

    xv6/bootasm.S #include "asm.h" #include "memlayout.h" #include "mmu.h" ...

  5. Python Random模块生成伪随机数字

    This module implements pseudo-random number generators for various distributions. 对于整数,有一个范围的均匀选择: 对 ...

  6. Tutorial 2: Requests and Responses

    转载自:http://www.django-rest-framework.org/tutorial/2-requests-and-responses/ Tutorial 2: Requests and ...

  7. docker swarm join 报错

    [peter@minion ~]$ docker swarm join --token SWMTKN-1-3mj5po3c7o04le7quhkdhz6pm9b8ziv3qe0u7hx0hrgxsna ...

  8. (总结)MySQL自带的性能压力测试工具mysqlslap详解

    PS:今天一同事问我有木有比较靠谱的mysql压力测试工具可用.其实mysql自带就有一个叫mysqlslap的压力测试工具,还是模拟的不错的.下面举例说说.mysqlslap是从5.1.4版开始的一 ...

  9. 阻止MyEclipse启动项目时自动跳转的debug视图

    启动web项目时,习惯使用debug方式启动,但此时会自动跳转到debug视图,很不习惯. 通过修改首选项配置,可以禁止跳转

  10. [Ext JS 4]后台自动产生图档

    前言 [Ext JS 4] 实战之将chart导出为png, jpg 格式的文件 承接上一篇, 我们可以做到在Browser端打开一个Chart,并导出为png或是jpg 等格式的图档. 但实际的需求 ...