edcc缩点之后跳倍增lca
丢个edcc缩点模板

Code:

#include <cstdio>
#include <cstring>
using namespace std; const int N = 1e5 + ;
const int M = 2e5 + ;
const int Lg = ; int n, m, qn, tot = , head[N], dep[N], fa[N][Lg];
int dfsc = , dcc = , dfn[N], low[N], bel[N], ex[M], ey[M];
bool bri[M << ], vis[N]; struct Edge {
int to, nxt;
} e[M << ]; inline void add(int from, int to) {
e[++tot].to = to;
e[tot].nxt = head[from];
head[from] = tot;
} inline void read(int &X) {
X = ;
char ch = ;
int op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline int min(int x, int y) {
return x > y ? y : x;
} void tarjan(int x, int inEdge) {
dfn[x] = low[x] = ++dfsc;
for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(!dfn[y]) {
tarjan(y, i);
low[x] = min(low[x], low[y]);
if(dfn[x] < low[y]) bri[i] = bri[i ^ ] = ;
} else if(i != (inEdge ^ ))
low[x] = min(low[x], dfn[y]);
}
} void dfs(int x) {
bel[x] = dcc;
for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(bel[y] || bri[i]) continue;
dfs(y);
}
} void dfs2(int x, int fat, int depth) {
vis[x] = , fa[x][] = fat, dep[x] = depth;
for(int i = ; i <= ; i++)
fa[x][i] = fa[fa[x][i - ]][i - ];
for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(vis[y]) continue;
dfs2(y, x, depth + );
}
} void swap(int &x, int &y) {
int t = x;
x = y;
y = t;
} inline int getLca(int x, int y) {
if(dep[x] < dep[y]) swap(x, y);
for(int i = ; i >= ; i--)
if(dep[fa[x][i]] >= dep[y])
x = fa[x][i];
if(x == y) return x;
for(int i = ; i >= ; i--)
if(fa[x][i] != fa[y][i])
x = fa[x][i], y = fa[y][i];
return fa[x][];
} int main() {
read(n), read(m);
for(int i = ; i <= m; i++) {
read(ex[i]), read(ey[i]);
add(ex[i], ey[i]), add(ey[i], ex[i]);
} for(int i = ; i <= n; i++)
if(!dfn[i]) tarjan(i, );
for(int i = ; i <= n; i++)
if(!bel[i]) {
++dcc;
dfs(i);
} /* for(int i = 1; i <= n; i++)
printf("%d ", bel[i]);
printf("\n"); */ tot = ;
memset(head, , sizeof(head));
for(int i = ; i <= m; i++) {
if(bel[ex[i]] == bel[ey[i]]) continue;
add(bel[ex[i]], bel[ey[i]]), add(bel[ey[i]], bel[ex[i]]);
}
for(int i = ; i <= n; i++)
if(!vis[i]) dfs2(i, , ); read(qn);
for(int x, y; qn--; ) {
read(x), read(y);
x = bel[x], y = bel[y];
if(x == y) puts("");
else printf("%d\n", dep[x] + dep[y] - * dep[getLca(x, y)]);
}
return ;
}

CH24C 逃不掉的路的更多相关文章

  1. CH#24C 逃不掉的路 和 HDU3686 Traffic Real Time Query System

    逃不掉的路 CH Round #24 - 三体杯 Round #1 题目描述 现代社会,路是必不可少的.任意两个城镇都有路相连,而且往往不止一条.但有些路连年被各种XXOO,走着很不爽.按理说条条大路 ...

  2. ContestHunter#24-C 逃不掉的路

    Description: 求无向图的必经边 思路:一眼题 将无向图缩成树,然后求两点树上距离 #include<iostream> #include<vector> #incl ...

  3. CH Round #24 - 三体杯 Round #1-C 逃不掉的路

    留个e-DCC的板子 #include<cstdio> #include<iostream> #include<cstring> #include<cstdl ...

  4. 高并发第九弹:逃不掉的Map --> HashMap,TreeMap,ConcurrentHashMap

    平时大家都会经常使用到 Map,面试的时候又经常会遇到问Map的,其中主要就是 ConcurrentHashMap,在说ConcurrentHashMap.我们还是先看一下, 其他两个基础的 Map ...

  5. 逃不掉的mysql数据库安装方式大全yum rpm 源码

    数据库虽然也不是天天安装,但每次安装都要找来找去挺烦,特整理记录在此. 系统基于:Centos 7.x 数据库版本: MySQL 5.7.x 转载请注明出处 Yum 安装方式 1.下载 yum rep ...

  6. Spring Cloud实战 | 第十篇 :Spring Cloud + Seata 1.4.1 + Nacos1.4.0 整合实现微服务架构中逃不掉的话题分布式事务

    Seata分布式事务在线体验地址:https://www.youlai.store 本篇完整源码地址:https://github.com/hxrui/youlai-mall 有想加入开源项目开发的童 ...

  7. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  8. D8 双连通分量

    记得有个梗那一天,zw学生zzh大佬说逃不掉的路变成a不掉的题哈哈哈哈: 分离的路径: BZOJ 1718POJ 3177LUOGU 286: 思路:在同一个边双连通分量中,任意两点都有至少两条独立路 ...

  9. P6跨级晋升P8再到P10,我的11年成长之路

    来自:语雀,作者:玉伯 链接:https://www.yuque.com/yubo/morning/grow-up-at-alibaba 注:这是在阿里内部前端大学的一个分享,整理了一份对外的版本,希 ...

随机推荐

  1. model1 就是jsp+javabean

  2. New Concept English three (50)

    31 39 The New Year is a time for resolutions. Mentally, at least, most of us could compile formidabl ...

  3. ProjectEuler654

    我,ycl:BM是什么早就忘了! 毕老爷:那你们可以做一做这道题练练BM板子啊. 传送门 //Achen #include<bits/stdc++.h> #define For(i,a,b ...

  4. RabbitMQ 权限分离&HA操作文档

    概要 默认情况下,使用帐号guest帐号登陆MQ,所有用户的queue信息,全部创建在根目录/的virtual host下,而这样,就会导致,任一用户登录后,都能看到其他用户的queue信息. 针对以 ...

  5. centos7 node express项目 将http接口升级为https接口的解决方法

    1.将对应的ssl证书放到项目文件中(我装的镜像是oneinstack的,创建项目时可以直接选择生成ssl证书的项目,即 xxx.key 和 xxx.crt 文件): 2.修改bin/www文件,修改 ...

  6. 学习动态性能表(10)--v$session_longops

    学习动态性能表 第十篇--V$SESSION_LONGOPS  2007.6.7 本视图显示运行超过6秒的操作的状态.包括备份,恢复,统计信息收集,查询等等. 要监控查询执行进展状况,你必须使用cos ...

  7. jslint报错太多的解决方式

    当jslint 一个js的时候,有时候太多“错误”,导致报错:“Too many errors. (53% scanned).”而停止检查 js文件,此时我们还是想把整个js文件检查完毕的. 所以,看 ...

  8. BZOJ2724:[Violet 6]蒲公英

    浅谈分块:https://www.cnblogs.com/AKMer/p/10369816.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...

  9. python3小例子:scrapy+mysql

    https://blog.csdn.net/u010151698/article/details/79371234

  10. eclipse下不能编译.ftl文件,会报错的解决方法

    先安装一个插件 右击ftl文件,选择open with 但是没有freeMarker这个选项,如果有直接打开,如果没有则需要下载相关插件. 要安装一个freemarker的插件,才可以编辑FTL文件, ...