bzoj 2125 最短路 点双 圆方树
LINK:最短路
一张仙人掌图 求图中两点最短路。
\(n<=10000,Q<=10000,w>=1\)
考虑边数是多少 m>=n-1 对于一张仙人掌图 考虑先构建出来dfs树 非树边会形成环 环不可能相交 也没有自环 那么说一每形成一个环需要一条树边和非树边。
所以m<=2n-2.
求图中两点最短路。离线做也不太好做。考虑一下一个点到另外一个点 会经过一些割点 必经之点 那么任意两个割点之间的最短路有两条。
显然其中一条永远没用 考虑构建出圆方树 边权dfs的时候处理一下即可。求距离树上求LCA即可。
不知道哪里挂了 回来再调。
4.6 update:闲来无事拍了一下 发现了自己的思想漏洞。
之前少处理了一种情况 考虑一个环内 两点各自的儿子之间的最短距离。
他们的LCA为方点 这说明了要爬到这个环内然后然后 对于环有两条路径 所以需要特判 我之前只注意到环内点了 所以挂了。
正确的是 判LCA 然后x向上跳 y向上跳 然后计算距离即可。
计算环的距离时我暴力了一点 求了一发 L 和 R数组.
const int MAXN=20010;
int n,m,Q,len=1,cnt,top,sum,len1,id,cc;
int dfn[MAXN],low[MAXN],s[MAXN],f[MAXN][20],a[MAXN],b[MAXN],Log[MAXN],L[MAXN],R[MAXN];
int lin[MAXN],ver[MAXN<<1],nex[MAXN<<1],e[MAXN<<1],d[MAXN],dis[MAXN],w[MAXN],h[MAXN];
int lin1[MAXN],ver1[MAXN<<1],nex1[MAXN<<1],e1[MAXN<<1];
inline void add(int x,int y,int z){ver[++len]=y;nex[len]=lin[x];lin[x]=len;e[len]=z;}
inline void add1(int x,int y,int z){ver1[++len1]=y;nex1[len1]=lin1[x];lin1[x]=len1;e1[len1]=z;}
inline void solve(int x)
{
add1(x,id,0);
rep(2,sum,i)
{
L[a[i]]=dis[a[i]]-dis[a[1]];R[a[i]]=b[a[i]]-dis[a[1]];
if(i+1<=sum)
{
b[a[i+1]]=dis[a[i]]-dis[a[i+1]]+b[a[i]];
//if(dis[a[i]]<=dis[a[i+1]])cout<<"ww"<<endl;
}
w[a[i]]=min(dis[a[i]],b[a[i]]);
}
rep(2,sum,i)add1(id,a[i],w[a[i]]-dis[a[1]]);
}
inline void dfs(int x)
{
dfn[x]=low[x]=++cnt;
s[++top]=x;
go(x)
{
if(!dfn[tn])
{
dis[tn]=dis[x]+e[i];
h[tn]=i;dfs(tn);
low[x]=min(low[x],low[tn]);
if(low[tn]>=dfn[x])
{
int y=0;sum=0;
a[++sum]=x;
while(y!=tn)
{
y=s[top--];
a[++sum]=y;
}
++id;solve(x);
}
}
else
{
low[x]=min(low[x],dfn[tn]);
if((i^1)!=h[x])b[x]=dis[tn]+e[i];
}
}
}
inline void dfs(int x,int fa)
{
d[x]=d[fa]+1;f[x][0]=fa;
rep(1,Log[d[x]],i)f[x][i]=f[f[x][i-1]][i-1];
for(int i=lin1[x];i;i=nex1[i])
{
int tn=ver1[i];
dis[tn]=dis[x]+e1[i];
dfs(tn,x);
}
}
inline int LCA(int x,int y)
{
if(d[x]<d[y])swap(x,y);
fep(Log[d[x]],0,i)
if(d[f[x][i]]>=d[y])x=f[x][i];
if(x==y)return x;
fep(Log[d[x]],0,i)
if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][0];
}
inline int get_x(int x,int w)
{
fep(Log[d[x]],0,i)if(d[f[x][i]]>=w)x=f[x][i];
return x;
}
int main()
{
freopen("1.in","r",stdin);
get(n);get(m);get(Q);
rep(1,m,i)
{
int x,y,z;
get(x);get(y);get(z);
add(x,y,z);add(y,x,z);
b[i]=INF;
}
id=n;dfs(1);
rep(2,id,i)Log[i]=Log[i>>1]+1;
dfs(1,0);
rep(1,Q,i)
{
int get(x);int get(y);
int lca=LCA(x,y);
if(lca>n)
{
int xx=get_x(x,d[lca]+1);
int yy=get_x(y,d[lca]+1);
if(L[xx]<L[yy])swap(xx,yy);
int ww=min(L[xx]-L[yy],R[xx]+L[yy]);
put(ww+dis[x]-dis[xx]+dis[y]-dis[yy]);continue;
}
put(dis[x]+dis[y]-dis[lca]*2);
}
return 0;
}
bzoj 2125 最短路 点双 圆方树的更多相关文章
- UOJ#23. 【UR #1】跳蚤国王下江南 仙人掌 Tarjan 点双 圆方树 点分治 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ23.html 题目传送门 - UOJ#23 题意 给定一个有 n 个节点的仙人掌(可能有重边). 对于所有 ...
- 【BZOJ】2125: 最短路 圆方树(静态仙人掌)
[题意]给定带边权仙人掌图,Q次询问两点间最短距离.n,m,Q<=10000 [算法]圆方树处理仙人掌问题 [题解]树上的两点间最短路问题,常用倍增求LCA解决,考虑扩展到仙人掌图. 先对仙人掌 ...
- BZOJ.2125.最短路(仙人掌 圆方树)
题目链接 圆方树.做题思路不写了.. 就是当LCA是方点时跳进那个环可以分类讨论一下用树剖而不必须用倍增: 如果v是u的(唯一的那个)重儿子,那么u的DFS序上+1的点即是要找的:否则v会引出一条新的 ...
- BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树
题意 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量. 他们每天都生活在巨大的压力之下.小强建立了一个模型.这世界上有N个网络设备, ...
- 【BZOJ2125】最短路(仙人掌,圆方树)
[BZOJ2125]最短路(仙人掌,圆方树) 题面 BZOJ 求仙人掌上两点间的最短路 题解 终于要构建圆方树啦 首先构建出圆方树,因为是仙人掌,和一般图可以稍微的不一样 直接\(tarjan\)缩点 ...
- 【刷题】BZOJ 2125 最短路
Description 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. Input 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个 ...
- BZOJ2125 最短路 圆方树、倍增
传送门 对仙人掌建立圆方树,然后对边定权 对于圆点和圆点之间的边,是原来仙人掌上的桥,边权保持不变 对于圆点和方点之间的边,将圆方树看做以一个圆点为根的有根树之后,一个方点的父亲一定是一个圆点.对于这 ...
- BZOJ.2125.最短路(仙人掌 最短路Dijkstra)
题目链接 多次询问求仙人掌上两点间的最短路径. 如果是在树上,那么求LCA就可以了. 先做着,看看能不能把它弄成树. 把仙人掌看作一个图(实际上就是),求一遍根节点到每个点的最短路dis[i]. 对于 ...
- 2018.07.25 bzoj2125: 最短路(圆方树+倍增)
传送门 人生的第一道仙人掌. 这道题求是仙人掌上的最短路. 先建出圆方树,然后用倍增跑最短路,当lca" role="presentation" style=" ...
随机推荐
- 数据库基础01-SQL基础语法
数据库查询语言(Structured Query Language) 数据库查询语言: DDL(data definition language) -数据定义语言,建库建表 DML (data man ...
- 创建新用户后无法切换 su: failed to execute /bin/bash: Permission denied
创建新用户后无法切换 su: failed to execute /bin/bash: Permission denied 当使用 su username 从root切换用户时显示 su: fai ...
- day30 继承、派生与多态,类中方法和内置函数
目录 一.多继承出现的问题(mixins机制) 二.派生与方法重用 三.多态 1 什么是多态 2 为什么要有多态 3 python中多态的鸭子类型 四.绑定方法与非绑定方法 1 绑定方法 1.1对象的 ...
- Oracle基础介绍及常用相关sql*plus命令
以管理员身份运行Database Configuration Assistant,新建数据库实例. 要使用Oracle首先要启动Oracle服务,在任务管理器中找到服务,打开有关OracleServi ...
- spring-boot 应用 报错 No qualifying bean of type XXXXX.***Mapper
报错类型 NoSuchBeanDefinitionException.No qualifying bean of type XXXXX.***Mapper 报错信息详情 Caused by: org ...
- 论TEMP临时变量与VAR静态变量区别
TEMP临时变量:顾名思义,这种变量类型是临时的,没有固定的存放数据的内存空间.每次扫描结束后则清零,在下个扫描周期开始时,这个变量的值都是不确定的,一般为0.使用临时变量需要遵循一个原则:先赋值再使 ...
- JVM 学习笔记(四)
回顾: 在之前的文章中,我们主要体现了当堆内存设置的比较小的情况下,比如:-Xmx20M -Xms20M,在项目运行的过程中,不断往内存中去添加对象, 这时候就会出现OOM,也就是内存溢出,本文章将展 ...
- java IO流 (五) 转换流的使用 以及编码集
转换流的使用 1.转换流涉及到的类:属于字符流InputStreamReader:将一个字节的输入流转换为字符的输入流解码:字节.字节数组 --->字符数组.字符串 OutputStreamWr ...
- sublime text 3+java只编译不输出结果 solution
文章摘自:https://blog.csdn.net/VincentLuo91/article/details/53007135 版权声明:本文为CSDN博主「vincentluo91」的原创文章,遵 ...
- Go Pentester - HTTP Servers(1)
HTTP Server Basics Use net/http package and useful third-party packages by building simple servers. ...