正题

题目链接:https://www.luogu.com.cn/problem/P5236


题目大意

给一个边仙人掌(一条边至多在一个环中),每次询问两点之间的距离


解题思路

我们对于每个环新建方点,然后方点连向所有环上的点,然后计算一下每一条的边权

需要注意的是,如果两个询问点的LCALCALCA是一个方点,那么需要特判


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3e4+10,K=18;
struct node{int to,next,w;
}a[N*2],e[N*2];
int n,m,q,tot,num,cnt;
int f[N][K],s[N],val[N],dep[N],dis[N];
int ls[N],rs[N],dfn[N],low[N];
void addl(int x,int y,int w){a[++tot].to=y;a[tot].next=ls[x];a[tot].w=w;ls[x]=tot;
}
void adde(int x,int y,int w){e[++tot].to=y;e[tot].next=rs[x];e[tot].w=w;rs[x]=tot;
}
void circle(int x,int y,int w){num++;int now=y,sum=w;while(now!=f[x][0]){s[now]=sum;sum+=val[now];now=f[now][0];}sum=s[num]=s[x];s[x]=0;now=y;int Dis;while(now!=f[x][0]){Dis=min(s[now],sum-s[now]);adde(num,now,Dis);adde(now,num,Dis);now=f[now][0];}return;
}
void tarjan(int x){dfn[x]=low[x]=++cnt;int flag=0;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==f[x][0])continue;if(!dfn[y]){f[y][0]=x;val[y]=a[i].w;tarjan(y);low[x]=min(low[x],low[y]);}else low[x]=min(low[x],dfn[y]);if(low[y]<=dfn[x])continue;adde(x,y,a[i].w);adde(y,x,a[i].w);}for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(x==f[y][0]||dfn[x]>=dfn[y])continue;circle(x,y,a[i].w);}return;
}
void dfs(int x,int fa){for(int i=rs[x];i;i=e[i].next){int y=e[i].to;if(y==fa)continue;dep[y]=dep[x]+1;dis[y]=dis[x]+e[i].w;f[y][0]=x;dfs(y,x);}return;
}
int Get_dis(int x,int y){int u=x,v=y;if(dep[x]>dep[y])swap(x,y);for(int i=K-1;i>=0;i--)if(dep[f[y][i]]>=dep[x])y=f[y][i];int lca;if(x!=y){for(int i=K-1;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];lca=f[x][0];}else lca=x;if(lca<=n)return dis[u]+dis[v]-dis[lca]*2;else {int ans=dis[u]-dis[x]+dis[v]-dis[y];return ans+min(s[lca]-abs(s[x]-s[y]),abs(s[x]-s[y]));}
}
int main()
{scanf("%d%d%d",&n,&m,&q);num=n;for(int i=1;i<=m;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);addl(x,y,w);addl(y,x,w);}tot=0;tarjan(1);dep[1]=1;dfs(1,0);for(int i=1;i<K;i++)for(int j=1;j<=num;j++)f[j][i]=f[f[j][i-1]][i-1]; for(int i=1;i<=q;i++){int x,y;scanf("%d%d",&x,&y);printf("%d\n",Get_dis(x,y));}
}

P5236-[模板]静态仙人掌【tarjan,LCA】相关推荐

  1. 【图论】【模板】静态仙人掌(luogu 5236)

    [模板]静态仙人掌 题目大意 给你一个无向仙人掌图(保证每条边至多出现在一个简单回路中的无向图),问你两个点之间的最短路距离 输入样例#1 9 10 2 1 2 1 1 4 1 3 4 1 2 3 1 ...

  2. 学生信息注册表模板html,学生信息管理系统模板(静态页面)

    [实例简介] 一个很好的学生信息管理系统模板(静态页面)非常好的一个资源 [实例截图] [核心代码] 学生信息管理系统模板 └── 学生信息管理系统模板 ├── EducationCenter │   ...

  3. HTML5期末大作业:抗击疫情网页——逆行者(7个页面) 大学生抗疫感动专题网页 疫情防控网页设计HTML模板 大学生抗疫感动专题网页设计作业模板 静态HTML CSS网站制作成品

    HTML5期末大作业:抗击疫情网页--逆行者(7个页面) 大学生抗疫感动专题网页 疫情防控网页设计HTML模板 大学生抗疫感动专题网页设计作业模板 静态HTML CSS网站制作成品 临近期末, 你还在 ...

  4. P5236 【模板】静态仙人掌(仙人掌圆方树)

    无向仙人掌图 一般需要重构成 仙人掌有向树 然后我们 就考虑 圆点的 方点的不同讨论 这个题是查询两点间最短路 如果lca 是圆点 那么就是 d[a]+d[b]-2*d[lca] 如果是方点 我们需要 ...

  5. 洛谷 :P5236 【模板】静态仙人掌(圆方树模板 + 仙人掌最短路)

    题意很简单,在仙人掌图上求两点的最短路. 做法:需要用到圆方树 先来看看什么是圆方树:圆方树,就是由仙人掌图转化而来,树上分两种点:圆点和方点,圆点是仙人掌图上的点,方点是由仙人掌的环转化而来. 由于 ...

  6. 仙人掌与圆方树的学习 【模板】静态仙人掌

    题目链接 BZOJ 2125 最短路 圆方树 求一幅仙人掌图中,Q次询问两点最短路. 仙人掌问题,我们可以直接将原来的N个点缩点成为一棵生成树--圆方树. 这棵圆方树是怎样建立的呢,首先,我们看图: ...

  7. ssl1746-商务旅行【tarjan,LCA】

    正题 题目大意 一个n-1个点的有向无环图,给出若干个点,要求依次到达的最少时间. 解题思路 有向无环图我们可以把其看做一颗树,然后每次用LCA求两个点之间的距离,然后把所有距离统计一下就是结果. 代 ...

  8. POJ1330-Nearest Common Ancestors【tarjan,LCA】

    正题 题目链接: http://poj.org/problem?id=1330 题目大意 就是给出一棵树,求LCA(最近公共祖先) 解题思路 用tarjan求LCA,这里给出tarjan算法 代码 # ...

  9. html怎么转换成ftl模板,FreeMarker入门+模板静态化+模板字符串静态化

    只是根据模板的内容,将数据模型在模板中显示并输出文件(通常为html,也可以生成其它格式的文本文件) 数据模型:数据模型在java中可以是基本类型也可以List.Map.Pojo等复杂类型 模板 输出 ...

最新文章

  1. Celery 框架学习笔记(分布式框架)
  2. 常用的linux命令20条,Linux常用的20条命令
  3. 在Web.Config中指定页面的基类
  4. FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)
  5. OpenCV图像几何变换——转置,镜像,倒置
  6. MySQL集群之五大常见的MySQL高可用方案(转)
  7. html怎么设置用户登录界面设计,html怎么做用户登录界面设计步骤,登录界面设计这样做?...
  8. 为心爱的人做一个超具创意的表白网页吧❤(告白气球)HTML+CSS+JavaScript
  9. 第一章 Lua - AIR202 控制LED小灯
  10. mkv转换mp4格式,mkv格式转mp4
  11. 加权随机采样 (Weighted Random Sampling)
  12. AnySDK+GooglePlay对接1
  13. 微信又双叒更新了!这次的隐藏功能,又一大型集体游街示众的 “社死“ 现场......!
  14. 新技术表明通过观察灯泡振动可进行窃听,以后聊天得拉窗帘
  15. 鸿蒙kal内核,鸿蒙OS发布!官方打脸安卓换壳:华为自研Open鸿蒙内核不兼容安卓...
  16. 立冬、小雪、凛冬将至:如何理解美国科技企业裁员潮?
  17. STM32固件库(标准外设库)入门学习 第四章OLED屏幕使用
  18. 用MVC写的查询,添加,删除,修改,登录。
  19. 深入springboot怎么启动tomcat
  20. wireshark分析oracle报错,Linux下抓包工具tcpdump以及分析包的工具wireshark

热门文章

  1. java 双向链表_java集合类之LinkedList
  2. 国内linux内核镜像仓库,国内较快的maven仓库镜像
  3. 将span隐藏的函数_分类汇总函数Subtotal和Aggregate应用技巧解读
  4. python怎么读数据库的数据_python从数据库读取出来的字典怎么更加方便的插入数据库...
  5. 此 sqltransaction 已完成;它再也无法使用_手把手教你如何修眉毛,学会再也不用花钱去美容院了...
  6. 算法设计与分析——递归与分治策略——快速排序
  7. leetcode474. 一和零
  8. 7-11 租用游艇问题 (15 分)(思路+详解+一步步分析+网格解决动态规划问题)Come boy!!!!
  9. 解决Java当中 用point 画图时背景颜色变成黑色问题
  10. xml可以html标签吗,自定义html标签(XML)