Description:

求无向图的必经边

思路:一眼题 将无向图缩成树,然后求两点树上距离

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int N = 2e5 + ; int head[N], now = ;
struct edges{
int to, next;
}edge[N<<];
void add(int u,int v){ edge[++now] = {v, head[u]}; head[u] = now;} int n, m, dfn[N], low[N], cnt, tot, dict[N], Q, ans[N], dis[N], fa[N], vis[N];
bool bri[N<<];
struct query{
int to, id;
};
vector<query> q[N];
void q_add(int u, int v, int y){ q[u].push_back({v, y}); q[v].push_back({u, y}); }
void tarjan(int x, int in_edge){
dfn[x] = low[x] = ++cnt;
for(int i = head[x]; i; i = edge[i].next){
int v = edge[i].to;
if(!dfn[v]){
tarjan(v, i);
low[x] = min(low[x], low[v]);
if(low[v] > dfn[x]) bri[i] = bri[i ^ ] = ;
}
else if(i != (in_edge ^ )) low[x] = min(low[x], dfn[v]);
}
} void dfs(int x){
dict[x] = tot; vis[x] = ;
for(int i = head[x]; i; i = edge[i].next){
int v = edge[i].to;
if(vis[v] || bri[i]) continue;
dfs(v);
}
}
int get(int x){
if(x != fa[x]) return fa[x] = get(fa[x]);
return x;
}
void LCA(int x){
vis[x] = ;
for(int i = head[x]; i; i = edge[i].next){
int v = edge[i].to;
if(vis[v]) continue;
dis[v] = dis[x] + ;
LCA(v);
fa[v] = x;
}
for(int i = ; i < q[x].size(); i++){
int v = q[x][i].to, id = q[x][i].id;
if(vis[v] == ){
int lca = get(v);
ans[id] = min(ans[id], dis[x] + dis[v] - * dis[lca]);
}
}
vis[x] = ;
}
struct input{
int x, y;
}in[N];
int main(){
scanf("%d%d", &n, &m);
int x, y;
for(int i = ; i <= m; i++){
scanf("%d%d", &x, &y);
in[i] = {x, y};
add(x, y); add(y, x);
}
for(int i = ; i <= n; i++)
if(!dfn[i]) tarjan(i, );
for(int i = ; i <= n; i++)
if(!vis[i]) tot++, dfs(i);
memset(head, , sizeof(head));
memset(edge, , sizeof(edge)); now = ;
memset(vis, , sizeof(vis));
for(int i = ; i <= m; i++){
x = dict[in[i].x], y = dict[in[i].y];
if(x == y) continue;
add(x, y), add(y, x);
}
scanf("%d", &Q);
for(int i = ; i <= Q; i++){
scanf("%d%d", &x, &y);
x = dict[x], y = dict[y];
if(x == y) ans[i] = ;
else{
q_add(x, y, i);
ans[i] = 1e9;
}
}
for(int i = ; i <= n; i++) fa[i] = i;
LCA();
for(int i = ; i <= Q; i++)
printf("%d\n", ans[i]);
return ;
}

ContestHunter#24-C 逃不掉的路的更多相关文章

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

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

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

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

  3. CH24C 逃不掉的路

    edcc缩点之后跳倍增lca 丢个edcc缩点模板 Code: #include <cstdio> #include <cstring> using namespace std ...

  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. D8 双连通分量

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

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

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

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

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

随机推荐

  1. selenium自动化之js处理滚动条和元素聚焦

    selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 当我们页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接操作的,会报元素不可见异常的.这时候需要借助滚动 ...

  2. Django——POST请求及Action触发事件

    添加网页login,将类型置为post,并添加action page,也就是之前写好的页面 添加page网页的views函数,要求获取post指令,如果username及password均正确则跳转到 ...

  3. 自己动手做AI:Google AIY开发工具包解析

    2018年国际消费性电子展(CES)上,最明显的一个趋势是Amazon与Google的语音技术进驻战,如AmazonAlexa进驻到Acer笔电内,Google Assist进驻到KIA汽车内,其他如 ...

  4. HDU-1053:Advanced Fruits(LCS+路径保存)

    链接:HDU-1053:Advanced Fruits 题意:将两个字符串合成一个串,不改变原串的相对顺序,可将相同字母合成一个,求合成后最短的字符串. 题解:LCS有三种状态转移方式,将每个点的状态 ...

  5. MySQL-MMM方案

    参考文档: 官方文档:http://mysql-mmm.org/mmm2:guide 本文对mmm方案做简单介绍,并做1个简单的验证. 一.MySQL-MMM方案 1. MMM方案简介 MMM(Mul ...

  6. ES6的新特性(4)——字符串的扩展

    字符串的扩展 ES6 加强了对 Unicode 的支持,并且扩展了字符串对象. 字符的 Unicode 表示法 JavaScript 允许采用\uxxxx形式表示一个字在\u0000~\uFFFF之间 ...

  7. MD5加密字符串--基于python

    import hashlib#md5加密32位def md5(str): import hashlib m = hashlib.md5() m.update(str) return m.hexdige ...

  8. 王者荣耀交流协会final发布版本控制报告

    二次开发软件说明文档 Dec 6 纠正饼状图点击选择PSP文件无效. 添加饼状图丢失的代码. submit the files that last night I forgot. add shurum ...

  9. 冲刺阶段站立会议每日任务i4

    昨天对小组成员的任务进行了进一步细化分配,今天了解了安卓开发环境的相关知识. 遇到的问题: 没有遇到问题.

  10. 【IdentityServer4文档】- 使用密码保护 API

    使用密码保护 API OAuth 2.0 协议允许资源拥有者给客户端密码授权:客户端向令牌服务发送用户密码,以获取代表该用户的访问令牌. 该规范建议仅将“资源所有者密码授予”用于“可信”(或旧版)应用 ...