AcWing397 逃不掉的路(边双)
时间:2020-05-26
本文章向大家介绍AcWing397 逃不掉的路(边双),主要包括AcWing397 逃不掉的路(边双)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
无向图缩点的low值定义是经过一条B边能够到的点的dfn的最小值
如果low[v]>=low[u],说明有割点,但是要特判树边,如果low[v]>low[u],说明是有割边,但是要特判重边,本题很显然边双里的点都是不必要的
只有桥是必要的,先缩点之后跑一下lca
#include<bits/stdc++.h> using namespace std; const int N=5e5+10; int h[N],ne[N],idx,e[N],cnt; int dfn[N],low[N],isce[N]; int f[N][21]; int ecc[N]; int depth[N]; int fa[N]; vector<int> g[N]; void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++; } int n,m,times,ans; void tarjan(int u){ dfn[u]=low[u]=++times; int i; for(i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(!dfn[j]){ fa[j]=u; tarjan(j); low[u]=min(low[u],low[j]); if(dfn[u]<low[j]) isce[j]=1; } else if(j!=fa[u]) low[u]=min(low[u],dfn[j]); } } void dfs(int u,int x){ ecc[u]=x; for(int i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(ecc[j]||fa[j]==u&&isce[j]||fa[u]==j&&isce[u]) continue; dfs(j,x); } } void bfs(){ queue<int> q; q.push(1); memset(depth,0x3f,sizeof depth); depth[0]=0,depth[1]=1; while(q.size()){ int t=q.front(); q.pop(); int i; for(i=0;i<(int)g[t].size();i++){ int j=g[t][i]; if(depth[j]>depth[t]+1){ depth[j]=depth[t]+1; q.push(j); f[j][0]=t; for(int k=1;k<=20;k++){ f[j][k]=f[f[j][k-1]][k-1]; } } } } } int lca(int a,int b){ if(depth[a]<depth[b]) swap(a,b); int i; for(i=20;i>=0;i--){ if(depth[f[a][i]]>=depth[b]){ a=f[a][i]; } } if(a==b) return a; for(i=20;i>=0;i--){ if(f[a][i]!=f[b][i]){ a=f[a][i]; b=f[b][i]; } } return f[a][0]; } int main(){ ios::sync_with_stdio(false); cin>>n>>m; int i; memset(h,-1,sizeof h); for(i=1;i<=m;i++){ int a,b; cin>>a>>b; add(a,b); add(b,a); } tarjan(1); for(i=1;i<=n;i++){ if(!ecc[i]){ dfs(i,++cnt); } } for(i=1;i<=n;i++){ int j; for(j=h[i];j!=-1;j=ne[j]){ int k=e[j]; if(ecc[i]==ecc[k]) continue; g[ecc[i]].push_back(ecc[k]); } } bfs(); int qi; cin>>qi; while(qi--){ int x,y; cin>>x>>y; x=ecc[x],y=ecc[y]; int p=lca(x,y); cout<<depth[x]+depth[y]-2*depth[p]<<endl; } }
原文地址:https://www.cnblogs.com/ctyakwf/p/12963349.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【-Flutter绘制集录-】第一画: 随机对称点头像
- TorchScript使用的注意事项和常见错误
- Scoped 样式穿透
- 你不知道的this(1)
- PyTorch模型转TVM模型全流程记录
- 一次 Node.js http 连接无法复用的问题排查
- 基于UE4/Unity绘制地图基础元素-线(上篇)
- 编码、R 与 Windows (一)
- 【5分钟玩转Lighthouse】Python绘制图表
- Matt Dowle 演讲节选(二)
- 帝国CMS的sitemap.xml设置和生成
- 【推荐】搭建你的免费 R 云端服务器
- ShareX 对接tu.my图床实现截图和图片自动上传
- 【技巧】如何快速按照日期分组
- 为什么 ggplot2 不支持两个 y 轴?