完结撒花!!!!!!!!!!!

最后一题填坑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: 最短路的更多相关文章

  1. bzoj3047: Freda的传呼机 && 2125: 最短路

    Description 为了随时与rainbow快速交流,Freda制造了两部传呼机.Freda和rainbow所在的地方有N座房屋.M条双向光缆.每条光缆连接两座房屋,传呼机发出的信号只能沿着光缆传 ...

  2. [BZOJ2125]最短路(圆方树DP)

    题意:仙人掌图最短路. 算法:圆方树DP,$O(n\log n+Q\log n)$ 首先建出仙人掌圆方树(与点双圆方树的区别在于直接连割边,也就是存在圆圆边),然后考虑点u-v的最短路径,显然就是:在 ...

  3. bzoj2125 最短路

    Description 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. Input 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个 ...

  4. BZOJ2125 最短路 圆方树、倍增

    传送门 对仙人掌建立圆方树,然后对边定权 对于圆点和圆点之间的边,是原来仙人掌上的桥,边权保持不变 对于圆点和方点之间的边,将圆方树看做以一个圆点为根的有根树之后,一个方点的父亲一定是一个圆点.对于这 ...

  5. 2018.07.25 bzoj2125: 最短路(圆方树+倍增)

    传送门 人生的第一道仙人掌. 这道题求是仙人掌上的最短路. 先建出圆方树,然后用倍增跑最短路,当lca" role="presentation" style=" ...

  6. BZOJ2125 最短路 【仙人掌最短路】

    题目 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. 输入格式 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个整数v,u,w表示一 ...

  7. bzoj2125 最短路——仙人掌两点间距离

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2125 仙人掌!模仿 lyd 的代码写的,也算是努力理解了: 主要分成 lca 在环上和不在环 ...

  8. [BZOJ2125]最短路[圆方树]

    题意 给定仙人掌,多次询问两点之间的最短路径. \(n\le 10000, Q\le 10000​\) 分析 建出圆方树,分路径 lca 是圆点还是方点讨论. 预处理出根圆点到每个圆点的最短距离 \( ...

  9. 【题解】Bzoj2125最短路

    处理仙人掌 ---> 首先建立出圆方树.则如果询问的两点 \(lca\) 为圆点,直接计算即可, 若 \(lca\) 为方点,则需要额外判断是走环的哪一侧(此时与两个点在环上的相对位置有关.) ...

随机推荐

  1. 【译】x86程序员手册16-5.3联合使用段与分页转换

    5.3 Combining Segment and Page Translation  联合使用段与分页转换 Figure 5-12 combines Figure 5-2 and Figure 5- ...

  2. 神经网络图灵机(Neural Turing Machines, NTM)

    近期,Google Deep Mind团队提出了一个机器学习模型,并起了一个特别高大上的名字:神经网络图灵机,我为大家翻译了这篇文章,翻译得不是特别好,有些语句没读明白,欢迎大家批评指正  原论文出处 ...

  3. Python 模块的导入 day5

    一.模块 1.标准模块 python自带的 2.第三方模块 需要自己安装的模块 3.自己写的python文件 一个python文件,就是一个模块 (1)导入模块的实质 就是把你导入的模块运行了一遍 ( ...

  4. H5 应用程序缓存(离线缓存)

    离线缓存这个功能的实现有以下步骤: 1,以nginx做web服务器为例,在mime.types文件中添加一行:text/cache-manifest     manifest,作用是为了让服务器识别该 ...

  5. 解决高分屏/高DPI下GNOME3/Linux字体和按钮太小的问题

    更改系统设置就好了. 我的设备是Surface Pro,12英寸,分辨率2736x1824,在虚拟机里安装CentOS 7后字特别小,标题栏的最小化/最大化/关闭按钮也很小,眼睛受不了的. 更改两个设 ...

  6. 利用定时器 1和定时器0控制led1和led2分别 2hz和0.5hz闪烁

    //利用定时器 1和定时器0控制led1和led2分别 2hz和0.5hz闪烁 #include<reg52.h> #define uchar unsigned char #define ...

  7. 6.3.2 使用struct模块读写二进制文件

    使用 struct 模块需要使用 pack() 方法吧对象按指定个数进行序列化,然后使用文件对象的write方法将序列化的结果写入二进制文件:读取时需要使用文件对象的read()方法读取二进制文件内容 ...

  8. ZOJ 3199 Longest Repeated Substring

    Longest Repeated Substring Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on Z ...

  9. 暑假集训D15总结

    考试 日常爆炸= = T1数据背锅,回天乏力 推了两个小时的T2竟然莫名RE,我也是服了 T3考试时就没读懂题,做个鬼啊 今天一直在写某奇怪的技术贴,竟然没有写题解(手动滑稽) 希望明天不要乱炸吧 博 ...

  10. [TyvjP1515] 子串统计 [luoguP2408] 不同子串个数(后缀数组)

    Tyvj传送门 luogu传送门 经典题 统计一个字符串中不同子串的个数 一个字符串中的所有子串就是所有后缀的前缀 先求出后缀数组,求出后缀数组中相邻两后缀的 lcp 那么按照后缀数组中的顺序遍历求解 ...