题目链接

题意:

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

分析:

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

  我们这样去考虑,如果这个边连着的有一个点不是割点,那么就直接给它找到方点就行了,但是如果是割点呢?那么我们就找一次所有的与这两个点相邻的方点,然后找到就好了,但是这样的复杂度我们并不喜欢,我们可以考虑换一种想法,有了圆方树之后,我们要找路径间的圆点的个数,其实你想一想,如果以圆点开头圆点结尾就可以直接根据总点数求出(当然不这样写也行),然后就是开始配对,边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. 借Adobe XD之力,自动生成Flutter代码

    概述 今天,我们来聊聊一个专门为"懒人程序员"准备的工具--Adobe XD.使用它可以快速将原型设计图转换为可执行的Flutter代码, 而由于Flutter自身跨平台的特性,因 ...

  2. js排他性算法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. RabbitMQ系列之【CentOS6.5安装RabbitMQ】

    环境准备 操作系统:CentOS 6.5 Final RabbitMQ: 3.1.5 Python: 2.7.11 ErLang: R16B02 安装预环境(少什么安装什么) yum -y insta ...

  4. [AHOI2017/HNOI2017]单旋

    题目   点这里看题目. 分析   最妙的地方在于,这道题其实是用一种数据结构模拟另一种数据结构!   我们需要维护深度和树的结构,以下对于每个操作进行分别讨论. 插入一个新节点   可以发现,这个新 ...

  5. Divisors (求解组合数因子个数)【唯一分解定理】

    Divisors 题目链接(点击) Your task in this problem is to determine the number of divisors of Cnk. Just for ...

  6. 使用阿里云K8S 服务,丢失访问中原始IP 问题

    解决步骤: 1. 利用kubectl 修改 k8s 配置, 设置 external** = Local 2. 在服务发现与负载均衡界面,选择对应的LB 服务, 设置服务LB 的 external** ...

  7. Seafile的配置

    如果部署在apache或nginx后面,就是访问默认80或443.反向代理会帮你转到8000和8082上. 我使用443,我在路由器上设定了转发,比如 对外网12323这个端口会转到内网地址443上 ...

  8. 动作函数-web_custom_request

    web_custom_request("get_login", "URL=http://10.1.102.75:8000/login?user=Milton&pw ...

  9. matplotlib作图一例

    知识点都在这个例子里面: plt.figure(figsize=(10,10)) for i in range(25): plt.subplot(5,5,i+1) plt.xticks([]) plt ...

  10. java 拦截器解决xss攻击

    一.xss攻击 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序.这些恶意网页程序通常是JavaScript,但实际上也 ...