北方大学 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 ...
随机推荐
- LightOJ 1306 - Solutions to an Equation 裸EXGCD
本题是极其裸的EXGCD AX+BY+C=0 给你a b c 和x与y的区间范围,问你整数解有几组 作为EXGCD入门,题目比较简单 主要需要考虑区间范围的向上.向下取整,及正负符号的问题 问题是这正 ...
- 【NOIP】提高组2012 疫情控制
[题意]n个点的树,1为根,要求删除一些点使得截断根节点和所有叶子结点的路径(不能删根,可以删叶子).有m支军队在m个点上,每时刻所有军队可以走一步,最终走到的地方就是删除的点,求最短时间. [算法] ...
- 【洛谷 P2513】 [HAOI2009]逆序对数列(DP)
题目链接 这种求方案数的题一般都是\(dp\)吧. 注意到范围里\(k\)和\(n\)的范围一样大,\(k\)是完全可以更大的,到\(n\)的平方级别,所以这暗示了我们要把\(k\)写到状态里. \( ...
- 完全教程 Aircrack-ng破解WEP、WPA-PSK加密利器
其 实关于无线基础知识的内容还是挺多的,但是由于本书侧重于BT4自身工具使用的讲解,若是再仔细讲述这些外围的知识,这就好比讲述DNS工具时还要把 DNS服务器的类型.工作原理及配置讲述一遍一样,哈哈, ...
- php中的__call()函数重载
<?php #调用类中没有的方法时, 会自动调用__call方法重载 #第一个参数是调用时的方法名, 第二个参数为参数组成的数组 class Cat{ public function Hello ...
- 【Python学习笔记】Coursera课程《Using Python to Access Web Data》 密歇根大学 Charles Severance——Week6 JSON and the REST Architecture课堂笔记
Coursera课程<Using Python to Access Web Data> 密歇根大学 Week6 JSON and the REST Architecture 13.5 Ja ...
- sql 自定义split
以下数据库操作针对sql server. 问题来源:由于项目中,有的表字段内容是由多个id或多个其他内容拼接而成.(如:'1,2,3,4,5',或者'name_age_school'),特点是都用某个 ...
- Linux内核的架构
GNU/Linux操作系统架构 备注:IPC进程间通.IPC(Inter-Process Communication)是共享"命名管道"的资源,它是为了让进程间通信而开放的命名管道 ...
- monkey测试===如何获取android app的Activity
方法一(推荐): 手机连接adb,手机界面在需要取得activity的界面. 推荐使用该命令: adb shell dumpsys activity top | findstr ACTIVITY 获取 ...
- 【bzoj1649】Cow Roller Coaster
傻逼dp题. dp[i][j]表示用了i长度已花费成本j所能得到的价值. 然后枚举一下铁轨随便做了. 不行就sort一下. #include<bits/stdc++.h> #define ...