bzoj3047:Freda的传呼机&&bzoj2125: 最短路
完结撒花!!!!!!!!!!!
最后一题填坑1A仙人掌WWWWWWW我真流弊
首先把环拆开,环中每一个点连向环的根,然后搞LCA,答案就是套路的d[x]+d[y]-d[lca]*2
然后就可以发现,其实只有当fx和fy在同一个环里面,才有可能通过不同的路线导致答案更小,特判之即可。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std; struct node
{
int x,y,d,next;
}a[],e[];int len,last[],elen,elast[];
void ins(int x,int y,int d)
{
len++;
a[len].x=x;a[len].y=y;a[len].d=d;
a[len].next=last[x];last[x]=len;
}
void eins(int x,int y,int d)
{
elen++;
e[elen].x=x;e[elen].y=y;e[elen].d=d;
e[elen].next=elast[x];elast[x]=elen;
} bool edg[];int cnt,bel[],sum[],ts[];
int fa[],dep[],dis[];
int tp,id[],sdis[];
void DP(int rt,int bac)
{
tp=dep[bac]-dep[rt]+;
for(int i=;i<=tp;i++) id[tp-i+]=bac, bac=fa[bac]; sdis[]=;
for(int i=;i<=tp;i++)
{
sdis[i]=sdis[i-]+dis[id[i]];
ts[id[i]]=sdis[i];
}
cnt++;sum[cnt]=sdis[tp]+dis[rt]; for(int i=;i<=tp;i++)
{
ins(rt,id[i],min(sdis[i],sum[cnt]-sdis[i]));
edg[id[i]]=true;
bel[id[i]]=cnt;
}
}
int z,dfn[],low[];
void cactus(int x)
{
dfn[x]=low[x]=++z;
for(int k=elast[x];k;k=e[k].next)
{
int y=e[k].y;
if(dfn[y]==)
{
fa[y]=x;
dep[y]=dep[x]+;
dis[y]=e[k].d;
cactus(y);
low[x]=min(low[x],low[y]);
}
else if(y!=fa[x])
low[x]=min(low[x],dfn[y]);
} for(int k=elast[x];k;k=e[k].next)
{
int y=e[k].y;
if(fa[y]!=x&&dfn[x]<dfn[y])
{
int t=dis[x];
dis[x]=e[k].d;
DP(x,y);
dis[x]=t;
}
}
} //----------------------------------------- int Bin[];
int f[][];
void dfs(int x)
{
for(int i=;dep[x]>=Bin[i];i++)f[i][x]=f[i-][f[i-][x]]; for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y!=f[][x])
{
f[][y]=x;
dep[y]=dep[x]+;
dis[y]=dis[x]+a[k].d;
dfs(y);
}
}
}
int LCA(int x,int y,int &fx,int &fy)
{
int w=-;
if(dep[x]<dep[y]){swap(x,y);w=;}
for(int i=;i>=;i--)
if(dep[x]-dep[y]>=Bin[i])x=f[i][x];
if(x==y){fx=-;return x;}
for(int i=;i>=;i--)
if(dep[x]>=Bin[i]&&f[i][x]!=f[i][y])x=f[i][x],y=f[i][y];
if(w==-)fx=x,fy=y;
else fx=y,fy=x;
return f[][x];
} //--------------get_LCA---------------------------- int main()
{
int n,m,Q,x,y,dd;
scanf("%d%d%d",&n,&m,&Q);
len=;memset(last,,sizeof(last));
elen=;memset(elast,,sizeof(elast));
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&dd);
eins(x,y,dd);eins(y,x,dd);
}
z=cnt=;
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(edg,false,sizeof(edg));
fa[]=,dep[]=,cactus();
for(int i=;i<=n;i++)
if(edg[i]==false)
ins(fa[i],i,dis[i]); Bin[]=;for(int i=;i<=;i++)Bin[i]=Bin[i-]*;
f[][]=;dep[]=;dis[]=;dfs(); while(Q--)
{
scanf("%d%d",&x,&y);
int fx,fy,lca=LCA(x,y,fx,fy);
if(fx!=-&&bel[fx]!=&&bel[fx]==bel[fy])
{
dd=abs(ts[fx]-ts[fy]);
printf("%d\n",dis[x]-dis[fx]+dis[y]-dis[fy]+min(dd,sum[bel[fx]]-dd));
}
else
printf("%d\n",dis[x]+dis[y]-*dis[lca]);
}
return ;
}
bzoj3047:Freda的传呼机&&bzoj2125: 最短路的更多相关文章
- bzoj3047: Freda的传呼机 && 2125: 最短路
Description 为了随时与rainbow快速交流,Freda制造了两部传呼机.Freda和rainbow所在的地方有N座房屋.M条双向光缆.每条光缆连接两座房屋,传呼机发出的信号只能沿着光缆传 ...
- [BZOJ2125]最短路(圆方树DP)
题意:仙人掌图最短路. 算法:圆方树DP,$O(n\log n+Q\log n)$ 首先建出仙人掌圆方树(与点双圆方树的区别在于直接连割边,也就是存在圆圆边),然后考虑点u-v的最短路径,显然就是:在 ...
- bzoj2125 最短路
Description 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. Input 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个 ...
- BZOJ2125 最短路 圆方树、倍增
传送门 对仙人掌建立圆方树,然后对边定权 对于圆点和圆点之间的边,是原来仙人掌上的桥,边权保持不变 对于圆点和方点之间的边,将圆方树看做以一个圆点为根的有根树之后,一个方点的父亲一定是一个圆点.对于这 ...
- 2018.07.25 bzoj2125: 最短路(圆方树+倍增)
传送门 人生的第一道仙人掌. 这道题求是仙人掌上的最短路. 先建出圆方树,然后用倍增跑最短路,当lca" role="presentation" style=" ...
- BZOJ2125 最短路 【仙人掌最短路】
题目 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. 输入格式 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个整数v,u,w表示一 ...
- bzoj2125 最短路——仙人掌两点间距离
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2125 仙人掌!模仿 lyd 的代码写的,也算是努力理解了: 主要分成 lca 在环上和不在环 ...
- [BZOJ2125]最短路[圆方树]
题意 给定仙人掌,多次询问两点之间的最短路径. \(n\le 10000, Q\le 10000\) 分析 建出圆方树,分路径 lca 是圆点还是方点讨论. 预处理出根圆点到每个圆点的最短距离 \( ...
- 【题解】Bzoj2125最短路
处理仙人掌 ---> 首先建立出圆方树.则如果询问的两点 \(lca\) 为圆点,直接计算即可, 若 \(lca\) 为方点,则需要额外判断是走环的哪一侧(此时与两个点在环上的相对位置有关.) ...
随机推荐
- android黑科技系列——解析公众号文章消息和链接文章消息自动打开原理
一.辅助功能方案分析 关于WX的各种功能插件已经非常普遍了,而现在的插件都是依赖于Xposed框架进行的,所以个人觉得WX应该在这方便应对Xposed框架的使用防护,防止插件满天飞的现象,本文来介绍一 ...
- [Windows Server 2012] Filezilla安装方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:FileZ ...
- C语言保留字
数值变量相关: int float double char long short unsigned signed 储存说明符 const 用于声明常量 static用于限制变量/函数的作用范围等等 e ...
- php 在Linux下的安装
1.获取php源码 wget http://cn2.php.net/get/php-5.6.6.tar.gz/from/this/mirror mv mirror php-5.6.6.tar.gz t ...
- CAD把一个DWG文件中的多个图框一次性全部插入到打开的DWG文件中
主要用到函数说明: _DMxDrawX::InsertBlock 向控件数据库中插入一个图块,不用它插入匿名块,详细说明如下: 参数 说明 BSTR pszDwgFileName 图块定义的dwg 文 ...
- Sping装配之——自动装配
Sping从两个角度来实现自动化装配: 组件扫描(component scaning):spring会自动发现应用上下文中所创建的bean; 自动装配(autowiring):spring自动满足be ...
- 如何使用 Python 创建一名可操控的角色玩家
在 这个系列的第一篇文章 中,我解释了如何使用 Python 创建一个简单的基于文本的骰子游戏.在第二部分中,我向你们展示了如何从头开始构建游戏,即从 创建游戏的环境 开始.但是每个游戏都需要一名玩家 ...
- Configuring SSL on Enterprise Manager and the SLB (Release 12.1.0.2 and later)
From: http://docs.oracle.com/html/E24089_42/ha_setup.htm#sthref833 If the SLB is configured to use T ...
- python利用7z批量解压rar
一开始我使用了rarfile这个库,奈何对于含有密码的压缩包支持不好,在linux上不抛出异常:之后有又尝试了unrar..比rarfile还费劲.. 所以用了调用系统命令的方法,用7z来解压 通过a ...
- 17.使用原生cross-fiels技术解决搜索弊端
主要知识点: 原生cross-fiels的用法 原生cross-fiels解决三个弊端 一.原生cross-fiels的用法 GET /forum/article/_search { ...