北方大学 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 ...
随机推荐
- 从无到有搭建SSM框架
框架 https://www.cnblogs.com/xiaoL/p/7753130.html log4j配置详解 https://www.cnblogs.com/SummerinShire ...
- js获取摄像头视频流
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【洛谷 P3165】 [CQOI2014]排序机械臂 (Splay)
题目链接 debug了\(N\)天没debug出来,原来是找后继的时候没有pushdown... 众所周知,,Splay中每个编号对应的节点的值是永远不会变的,因为所有旋转.翻转操作改变的都是父节点和 ...
- Farey Sequence (欧拉函数+前缀和)
题目链接:http://poj.org/problem?id=2478 Description The Farey Sequence Fn for any integer n with n >= ...
- POJ 30253 Fence Repair (二叉树+优先队列)
题目链接 Description Farmer John wants to repair a small length of the fence around the pasture. He meas ...
- css纯样式导航
<style>.dropdown { position: relative; display: inline-block;} .dropdown-content { di ...
- bzoj 1197 DP
我们可以将这个问题转化为在n维空间中一共放m个n维球,求这m个球最多将这个空间分为不同的几个部分. 那么我们设w[i][j]代表i为空间放j个球分为的部分,那么w[i][j]=w[i][j-1]+w[ ...
- hdu 1863 畅通工程 (并查集+最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others) M ...
- Angular2.0 基础: Form
对于Angular2.0 的Form表单中的隐藏和验证,个人觉得还是挺有意思的. 1.通过ngModel 跟踪修改状态与验证. 在表单中使用 ngModel 可以获得更多的控制权,包括一些常用的验证. ...
- Python3 Socket和SocketServer 网络编程
socket只能实现同时一个服务和一个客户端实现交互,socketserver可以实现多个客户端同时和服务端交互 1.利用Socket编写简单的同一个端口容许多次会话的小案例: 服务端: #!/usr ...