Traffic Real Time Query System,题解
题目链接
题意:
问从一条边到另一条边的必经点。
分析:
首先,问必经点,当然是要点双缩点(圆方树)啦,关键是把边映射到哪一点上,其实直接放在某联通分量的方点上就行,但是这个点并不好找,所以我们考虑一个别的办法。
我们这样去考虑,如果这个边连着的有一个点不是割点,那么就直接给它找到方点就行了,但是如果是割点呢?那么我们就找一次所有的与这两个点相邻的方点,然后找到就好了,但是这样的复杂度我们并不喜欢,我们可以考虑换一种想法,有了圆方树之后,我们要找路径间的圆点的个数,其实你想一想,如果以圆点开头圆点结尾就可以直接根据总点数求出(当然不这样写也行),然后就是开始配对,边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,题解的更多相关文章
- 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 ...
- UVALive-4839 HDU-3686 Traffic Real Time Query System 题解
题目大意: 有一张无向连通图,问从一条边走到另一条边必定要经过的点有几个. 思路: 先用tarjan将双连通分量都并起来,剩下的再将割点独立出来,建成一棵树,之后记录每个点到根有几个割点,再用RMQ求 ...
- CH#24C 逃不掉的路 和 HDU3686 Traffic Real Time Query System
逃不掉的路 CH Round #24 - 三体杯 Round #1 题目描述 现代社会,路是必不可少的.任意两个城镇都有路相连,而且往往不止一条.但有些路连年被各种XXOO,走着很不爽.按理说条条大路 ...
- HDU 3686 Traffic Real Time Query System (图论)
HDU 3686 Traffic Real Time Query System 题目大意 给一个N个点M条边的无向图,然后有Q个询问X,Y,问第X边到第Y边必需要经过的点有多少个. solution ...
- 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 ...
- Traffic Real Time Query System 圆方树+LCA
题目描述 City C is really a nightmare of all drivers for its traffic jams. To solve the traffic problem, ...
- HDU Traffic Real Time Query System
题目大意是:对于(n, m)的图,给定边a, b查询从a到b要经过的割点的最少数目. 先tarjan算法求双连通然后缩点,即对于每个割点将周围的每个双连通看成一个点与之相连.然后求解LCA即可,距离d ...
- HDU3686 Traffic Real Time Query System
P.S.此题无代码,只有口胡,因为作者码炸了. 题目大意 给你一个有 \(n\) 个点, \(m\) 条边的无向图,进行 \(q\) 次询问,每次询问两个点 \(u\) \(v\),输出两个点的之间的 ...
- 【HDOJ】3686 Traffic Real Time Query System
这题做了几个小时,基本思路肯定是求两点路径中的割点数目,思路是tarjan缩点,然后以割点和连通块作为新节点见图.转化为lca求解.结合点——双连通分量与LCA. /* 3686 */ #includ ...
随机推荐
- 为什么我觉得 Java 的 IO 很复杂?
初学者觉得复杂是很正常的,归根结底是因为没有理解JavaIO框架的设计思想: 可以沿着这条路想一想: 1,学IO流之前,我们写的程序,都是在内存里自己跟自己玩.比如,你声明个变量,创建个数组,创建个集 ...
- 深入理解JVM(③)判断对象是否还健在?
前言 因为Java对象主要存放在Java堆里,所以垃圾收集器(Garbage Collection)在对Java堆进行回收前,第一件事情就是要确定这些对象之中哪些还"存活"着,哪些 ...
- leetcode 反转链表部分节点
反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明:1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL, m = 2, ...
- 白嫖永久免费云服务器教程,永久免费虚拟主机、永久免费云数据库、搭建FTP服务器、服务器安装Linux / windows操作系统、服务器部署网站、宝塔一键部署多网站、独立ip、永久国内高速云服务器
一.准备工作 1. 注册账号 声明:切记不可用服务器做违法的事情 申请地址:https://www.sanfengyun.com/ 图文教程地址:https://www.cnblogs.com/zwn ...
- Vue点击改变属性(改变文字颜色)
<template> <div class="tab-control"> <div v-for="(item , index) in tit ...
- VMware15 镜像Centos7修改静态IP
VMware15 镜像Centos7修改静态IP * 我的网卡名称为ens33: * 配置IP在 /etc/sysconfig/network-scripts/ifcfg-ens33 目录下: * D ...
- maven项目快速搭建SSM框架(一)创建maven项目,SSM框架整合,Spring+Springmvc+Mybatis
首先了解服务器开发的三层架构,分配相应的任务,这样就能明确目标,根据相应的需求去编写相应的操作. 服务器开发,大致分为三层,分别是: 表现层 业务层 持久层 我们用到的框架分别是Spring+Spri ...
- python获取本地时间戳
import time print(time.time())#获当前时间的时间戳 print(time.localtime())#获取本地时间 print(time.strftime('%Y-%m-% ...
- 浅谈async 及 await
async 及 await 涉及面试题:async 及 await 的特点,它们的优点和缺点分别是什么?await 原理是什么? 一个函数如果加上 async ,那么该函数就会返回一个 Promise ...
- 一起玩转微服务(10)——spring boot介绍
对于Spring,相信大家都非常熟悉,从出现开始,一直是企业级开发的主流.但是随着软件的发展和应用开发的不断演化,它的一些缺点也逐渐胡暴露了出来,下面,我们就一起看一下Spring的发展历程并且认识一 ...