北方大学 ACM 多校训练赛 第七场 C Castle(LCA)
【题意】给你N个点,N条不同的边,Q次询问,求出u,v之间的最短路。
【分析】题意很简单,就是求最短路,但是Q次啊,暴力DIJ?当然不行,观察到这个题边的数目和点的数目是相同的,也就是说这个图是由一棵树加了一条边而形成的。而对于一棵树,如果有Q次询问最短路,那就可以用LCA来做,复杂度QlogN,但是现在加了一条边,可能会使有些点之间的路径变短。假设多加的这条边的两个端点是U,V,那么对于询问的X,Y,有这么三种情况,直接过LCA,或者经过U,V,详情见代码。
#include <bits/stdc++.h>
#define met(a,b) memset(a,b,sizeof a)
#define pb push_back
#define mp make_pair
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lowbit(x) (x&(-x))
using namespace std;
typedef long long ll;
ll mod = 1e9+;
const int N=3e4+;
const int M=N*N+;
int n,m,k,root,son,dis[N],dep[N],fa[N][],parent[N];
int d;
vector<pair<int,int> >edg[N];
int Find(int x){
if(parent[x]!=x)parent[x]=Find(parent[x]);
return parent[x];
}
void Union(int x,int y){
x=Find(x);
y=Find(y);
if(x==y)return;
parent[y]=x;
}
void dfs(int u,int f){
fa[u][]=f;
for(int i=; i<; i++){
fa[u][i]=fa[fa[u][i-]][i-];
}
for(int i=; i<edg[u].size(); i++){
int v=edg[u][i].first;
if(v==f)continue;
dis[v]=dis[u]+edg[u][i].second;
dep[v]=dep[u]+;
dfs(v,u);
}
}
int Lca(int u,int v){
int U=u,V=v;
if(dep[u]<dep[v])swap(u,v);
for(int i=; i>=; i--){
if(dep[fa[u][i]]>=dep[v]){
u=fa[u][i];
}
}
if(u==v)return u;
for(int i=; i>=; i--){
if(fa[u][i]!=fa[v][i]){
u=fa[u][i];
v=fa[v][i];
}
}
return fa[u][];
}
int main(){
int u,v,w;
int T;
scanf("%d",&T);
while(T--){
for(int i=; i<N; i++)dis[i]=dep[i]=,edg[i].clear(),parent[i]=i;
met(fa,-);
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++){
scanf("%d%d%d",&u,&v,&w);
u++;v++;
if(Find(u)==Find(v))root=u,son=v,d=w;
else{
Union(u,v);
edg[u].pb(mp(v,w));
edg[v].pb(mp(u,w));
}
}
dep[root]=;
dfs(root,-);
while(m--){
scanf("%d%d",&u,&v);
u++;v++;
int lca=Lca(u,v);
int ans1=dis[u]+dis[v]-*dis[lca];
int ans2=dis[u]+dis[son]-*dis[Lca(u,son)]+dis[v]+dis[root]-*dis[Lca(root,v)]+d;
int ans3=dis[v]+dis[son]-*dis[Lca(v,son)]+dis[u]+dis[root]-*dis[Lca(root,u)]+d;
printf("%d\n",min(ans1,min(ans2,ans3)));
}
}
return ;
}
北方大学 ACM 多校训练赛 第七场 C Castle(LCA)的更多相关文章
- 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...
- HDU 4941 Magical Forest(map映射+二分查找)杭电多校训练赛第七场1007
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第 ...
- 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...
- 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...
- 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...
- 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html 题目传送门 - https://www.no ...
随机推荐
- 设置zookeeper开机自启动
1.进入到/etc/init.d目录下,新建一个zookeeper脚本 cd /etc/init.d vi zookeeper #!/bin/bash #chkconfig:2345 20 90 #d ...
- job源码分析
/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agree ...
- python实现备份gitlab版本库并更改文件名
脚本的功能是实现备份gitlab版本库,并修改备份后的文件名,成功后发送邮件至相关负责人,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- impo ...
- 省队集训Day1 睡觉困难综合征
传送门:https://www.luogu.org/problem/show?pid=3613 [题解] 按二进制位分开,对于每一位,用“起床困难综合征”的方法贪心做. 写棵LCT,维护正反两种权值, ...
- PHP练习4 留言板
一.要求 二.示例页面 三.网页代码及网页显示 1.denglu.php 登录页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...
- 洛谷 P3375 【模板】KMP字符串匹配
我这段时间因为字符串太差而被关了起来了(昨晚打cf不会处理字符串现场找大佬模板瞎搞,差点就凉了),所以决定好好补一下字符串的知识QAQ,暂时先学习kmp算法吧~ 题目链接:https://www.lu ...
- Python与RPC -- (转)
XML-RPC xmlrpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据. 一个rpc系统,必然包括2个部分: 1)rpc client,用来向rpc server调 ...
- Select 使用不当引发的core,你应该知道的
排查一个死机问题,搞了好几天时间,最终确定原因:最终确定问题原因,在此分享一下: 第一步:常规根据core文件查看栈信息,gdb –c core xxxx 如下rip不正确,指令地址错乱,栈信息已破坏 ...
- js删除数组中重复的元素
1.方法一 将数组逐个搬到另一个数组中,当遇到重复元素时,不移动,若元素不重复则移动到新数组中 function unique(arr){ var len = arr.length; var resu ...
- Asp.Net Forms获取UEeditor内容
UEeditor是比较常用的富文本编辑器. 获取编辑器的内容,需要使用js获取,官方提供的方法是:UE.getEditor('editor').getContent(); 官方提供的.net例子中是使 ...