题目链接

题意:

  问从一条边到另一条边的必经点。

分析:

  首先,问必经点,当然是要点双缩点(圆方树)啦,关键是把边映射到哪一点上,其实直接放在某联通分量的方点上就行,但是这个点并不好找,所以我们考虑一个别的办法。

  我们这样去考虑,如果这个边连着的有一个点不是割点,那么就直接给它找到方点就行了,但是如果是割点呢?那么我们就找一次所有的与这两个点相邻的方点,然后找到就好了,但是这样的复杂度我们并不喜欢,我们可以考虑换一种想法,有了圆方树之后,我们要找路径间的圆点的个数,其实你想一想,如果以圆点开头圆点结尾就可以直接根据总点数求出(当然不这样写也行),然后就是开始配对,边1连接的两点和边2连接的两点相配,分别求出路径上圆点的个数(不包括起点和终点),答案是什么呢?取max,为啥,因为都不包括起点和终点,为了防止某点为割点(+1并不行,是割点不一定就要过),我们只能进行取max,然后4次lca,最后找出答案。

  代码:

#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
const int maxn=2e4+;
const int maxm=1e5+;
struct E{
int to;
int next;
int from;
}ed[maxm*];
int head[maxn];
int tot;
void J(int a,int b){
tot++;
ed[tot].to=b;
ed[tot].from=a;
ed[tot].next=head[a];
head[a]=tot;
}
int dfn[maxn];
int low[maxn];
int sta[maxn];
int top;
int js;
int s;
int n;
E edx[maxn*];
int headx[maxn];
int totx;
void Jx(int a,int b){
totx++;
edx[totx].to=b;
edx[totx].next=headx[a];
headx[a]=totx;
}
void tarjan(int x){//缩点
js++;
low[x]=dfn[x]=js;
top++;
sta[top]=x;
for(int i=head[x];i;i=ed[i].next){
if(dfn[ed[i].to])
low[x]=min(low[x],dfn[ed[i].to]);
else{
tarjan(ed[i].to);
low[x]=min(low[ed[i].to],low[x]);
if(low[ed[i].to]==dfn[x]){
s++;
int tmp;
do{
tmp=sta[top];
top--;
Jx(n+s,tmp);
Jx(tmp,s+n);
}while(tmp!=ed[i].to);
Jx(x,n+s);
Jx(n+s,x);
}
}
}
}
int vis[maxn];
int dep[maxn];
int fa[maxn];
void Dfs(int x){
vis[x]=;
for(int i=headx[x];i;i=edx[i].next){
if(vis[edx[i].to])
continue;
dep[edx[i].to]=dep[x]+;
fa[edx[i].to]=x;
Dfs(edx[i].to);
}
}
int lc(int a,int b){//lca
if(dep[a]<dep[b])
swap(a,b);
while(dep[a]>dep[b])
a=fa[a];
if(a==b)
return a;
while(a!=b){
a=fa[a];
b=fa[b];
}
return a;
}
int l(int a,int b){
return (dep[a]+dep[b]-*dep[lc(a,b)])/-;
}
int main(){
int m;
while(~scanf("%d%d",&n,&m)&&(m||n)){
tot=;
memset(head,,sizeof(head));
totx=;
memset(headx,,sizeof(headx));
int js1,js2;
js=;
memset(dfn,,sizeof(dfn));
top=;
s=;
memset(vis,,sizeof(vis));
for(int i=;i<=m;i++){
scanf("%d%d",&js1,&js2);
J(js1,js2);
J(js2,js1);
}
for(int i=;i<=n;i++)
if(!dfn[i])
tarjan(i);
for(int i=;i<=n+s;i++)
if(!vis[i])
Dfs(i);
int q;
scanf("%d",&q);
for(int i=;i<=q;i++){
scanf("%d%d",&js1,&js2);
printf("%d\n",max(max(l(ed[js1*].to,ed[js2*].to),l(ed[js1*].from,ed[js2*].to)),max(l(ed[js1*].to,ed[js2*].from),l(ed[js1*].from,ed[js2*].from))));//分别计算
}
}
return ;
}

Traffic Real Time Query System,题解的更多相关文章

  1. HDU3686 Traffic Real Time Query System 题解

    题目 City C is really a nightmare of all drivers for its traffic jams. To solve the traffic problem, t ...

  2. UVALive-4839 HDU-3686 Traffic Real Time Query System 题解

    题目大意: 有一张无向连通图,问从一条边走到另一条边必定要经过的点有几个. 思路: 先用tarjan将双连通分量都并起来,剩下的再将割点独立出来,建成一棵树,之后记录每个点到根有几个割点,再用RMQ求 ...

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

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

  4. HDU 3686 Traffic Real Time Query System (图论)

    HDU 3686 Traffic Real Time Query System 题目大意 给一个N个点M条边的无向图,然后有Q个询问X,Y,问第X边到第Y边必需要经过的点有多少个. solution ...

  5. HDU 3686 Traffic Real Time Query System(双连通分量缩点+LCA)(2010 Asia Hangzhou Regional Contest)

    Problem Description City C is really a nightmare of all drivers for its traffic jams. To solve the t ...

  6. Traffic Real Time Query System 圆方树+LCA

    题目描述 City C is really a nightmare of all drivers for its traffic jams. To solve the traffic problem, ...

  7. HDU Traffic Real Time Query System

    题目大意是:对于(n, m)的图,给定边a, b查询从a到b要经过的割点的最少数目. 先tarjan算法求双连通然后缩点,即对于每个割点将周围的每个双连通看成一个点与之相连.然后求解LCA即可,距离d ...

  8. HDU3686 Traffic Real Time Query System

    P.S.此题无代码,只有口胡,因为作者码炸了. 题目大意 给你一个有 \(n\) 个点, \(m\) 条边的无向图,进行 \(q\) 次询问,每次询问两个点 \(u\) \(v\),输出两个点的之间的 ...

  9. 【HDOJ】3686 Traffic Real Time Query System

    这题做了几个小时,基本思路肯定是求两点路径中的割点数目,思路是tarjan缩点,然后以割点和连通块作为新节点见图.转化为lca求解.结合点——双连通分量与LCA. /* 3686 */ #includ ...

随机推荐

  1. ZSH隐藏命令行前面的用户名和主机名

    修改vim ~/.zshrc文件,在文件底部增加 隐藏用户名和主机名 prompt_context() {} 只保留用户名,隐藏主机名 prompt_context() { if [[ "$ ...

  2. Unable to open debugger port (127.0.0.1:55119): java.net.SocketException "Socket closed"

    1.端口问题 排查端口,lsof -i:8080 修改端口等 2.权限问题 端口排查无解的话,查看idea Event Log(View->Tool Window->Event Log) ...

  3. TensorFlow从0到1之TensorFlow优化器(13)

    高中数学学过,函数在一阶导数为零的地方达到其最大值和最小值.梯度下降算法基于相同的原理,即调整系数(权重和偏置)使损失函数的梯度下降. 在回归中,使用梯度下降来优化损失函数并获得系数.本节将介绍如何使 ...

  4. 使用 LIKE 的模糊查询

    字符串匹配的语法格式如下: <表达式1> [NOT] LIKE <表达式2> 字符串匹配是一种模式匹配,使用运算符 LIKE 设置过滤条件,过滤条件使用通配符进行匹配运算,而不 ...

  5. Mysql:bit类型的查询与插入

    原文链接:https://www.cnblogs.com/cuizhf/archive/2013/05/17/3083988.html Mysql关于bit类型的用法: 官方的资料如下: 9.1.5. ...

  6. Pytorch中的自动求梯度机制和Variable类

    自动求导机制是每一个深度学习框架中重要的性质,免去了手动计算导数,下面用代码介绍并举例说明Pytorch的自动求导机制. 首先介绍Variable,Variable是对Tensor的一个封装,操作和T ...

  7. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...

  8. HTML中doctype的作用及几种类型详解

    一.DOCTYPE标签的定义与作用 <!DOCTYPE>是一个用于声明当前HTMl版本,用来告知web浏览器该文档使用是哪种 HTML 或者 XHTML 规范来解析页面,以便浏览器更加准确 ...

  9. mapper.xml文件映射配置

    一.导入约束 为全局配置文件绑定dtd约束: 1)联网会自动绑定 2)没网的时候[/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd]:解压myba ...

  10. docker 镜像删除

    (我们以删除 php-fpm 这个镜像为例子) 一.查看镜像的 ID [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED ...