51nod1743-雪之国度【最小生成树,LCA,并查集】

正题

题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1743


题目大意

nnn个点mmm条边的一张图,每次询问要求找出x,yx,yx,y直接的两条不重路径的最大值最小。


解题思路

首先第一条路径肯定是最小生成树上的路径,所以我们先求出最小生成树。

然后对与剩下的边我们从小到大加入图中,每条边(u,v)(u,v)(u,v)会作为在(u,v)(u,v)(u,v)之间的所有点对的第二条路径。也就是对与一个点对(x,y)(x,y)(x,y)中间有经过(u,v)(u,v)(u,v)的路径那么都会取到这条边的值,也就是将(u,v)(u,v)(u,v)这条路径取minminmin,然后询问时就是询问(x,y)(x,y)(x,y)之间的最大值。

而且因为是从小到大加入的,所有如果一个位置之间已经加入过就不需要管,所以我们可以开一个并查集记录跳到最上面没有加入的点。

时间复杂度O(mlog⁡n)O(m\log n)O(mlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
struct node{int x,y;
}e[N];
struct edge_node{int to,next;
}a[N];
int n,m,q,tot,val[N],fa[N],ls[N];
int f[N][20],w[N][20],dep[N];
bool vis[N];
bool cmp(node x,node y)
{return abs(val[x.x]-val[x.y])<abs(val[y.x]-val[y.y]);}
int find(int x)
{return (fa[x]==x)?(x):(fa[x]=find(fa[x]));}
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(int x,int fa){if(x==341)x++,x--;f[x][0]=fa;dep[x]=dep[fa]+1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;dfs(y,x);}return;
}
int LCA(int x,int y){int ans=0;if(dep[x]>dep[y])swap(x,y);for(int i=18;i>=0;i--)if(dep[f[y][i]]>=dep[x])ans=max(ans,w[y][i]),y=f[y][i];if(x==y)return ans;for(int i=18;i>=0;i--)if(f[y][i]!=f[x][i])ans=max(ans,max(w[x][i],w[y][i])),x=f[x][i],y=f[y][i];return max(ans,max(w[x][0],w[y][0]));
}
int main()
{scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=n;i++)scanf("%d",&val[i]),fa[i]=i;for(int i=1;i<=m;i++)scanf("%d%d",&e[i].x,&e[i].y);sort(e+1,e+1+m,cmp);for(int i=1;i<=m;i++){int x=find(e[i].x),y=find(e[i].y);if(x==y)continue;addl(e[i].x,e[i].y);addl(e[i].y,e[i].x);fa[x]=y;vis[i]=1;}dfs(1,0);for(int i=1;i<=n;i++)fa[i]=i,w[i][0]=2147483647;for(int i=1;i<=m;i++){if(vis[i])continue;int x=find(e[i].x),y=find(e[i].y);while(x!=y){if(dep[x]<dep[y])swap(x,y);w[x][0]=abs(val[e[i].x]-val[e[i].y]); fa[x]=f[x][0];x=find(x);}}for(int j=1;j<=18;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1],w[i][j]=max(w[i][j-1],w[f[i][j-1]][j-1]);while(q--){int x,y;scanf("%d%d",&x,&y);int ans=LCA(x,y);if(ans==2147483647)printf("infinitely\n");else printf("%d\n",ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派3B+,我要跑.NET CORE

前面的话我也不知道为什么&#xff0c;看到.net core觉得很爽&#xff0c;可以真正的跨平台&#xff0c;个人觉得很喜欢&#xff0c;所以就准备拿树莓派来验证我的想法。在我写这篇文章的时候&#xff0c;刚好在树莓派上装好了core2.1&#xff0c;先上结果。一、基础准备从板子…

Codeforces1019C

Codeforces1019C 题意&#xff1a;一张无自环的有向图&#xff0c;请找出一个点集Q&#xff0c;满足Q内的点不能互相有边&#xff0c;且Q内的点一定可以通过1次或2次移动&#xff0c;到达Q集合以外的任意一个点。 做法&#xff1a;思路神奇。做法就是编号小到大枚举选的点&…

WZK的排名(jzoj 1995)

WZK的排名 jzoj 1995 题目大意&#xff1a; 有一个成绩排名&#xff0c;让你按成绩排序&#xff08;成绩相同&#xff0c;年级更小的在前面&#xff09;&#xff0c;让你求对于每个人来说&#xff0c;成绩比他大年级比他小的人的个数 输入样例 5 300 5 200 6 350 4 400 6 …

YbtOJ#20073-[NOIP2020模拟赛B组Day6]钻石守卫【构造】

正题 题目链接:http://noip.ybtoj.com.cn/contest/105/problem/3 题目大意 nnn个点mmm条边的图&#xff0c;保证每条边两边的点权和大于等于边权。现在要去减去最少/多的点权使得每条边的边权等于两边的点权。 解题思路 对与一个连通块&#xff0c;显然确定一个就可以确定别的…

【bfs】WZK旅游(jzoj 1996)

WZK旅游 jzoj 1996 题目大意&#xff1a; 给出一个nm的矩阵&#xff0c;表示一个地方的高度&#xff0c;高度相同且相邻&#xff08;不算斜角&#xff09;的算一块&#xff0c;当整一块高度都大于周围时&#xff0c;这是个山峰&#xff0c;相反当高度都低于附近时是湖泊&…

FWT学习笔记

FWT学习笔记 参考&#xff1a; 快速沃尔什变换(FWT)学习笔记FWT 详解 知识点定义&#xff1a; 快速沃尔什变换(FWT)主要解决位运算卷积的问题。给定两个数组 \(A\) 和 \(B\) (长度为2的整数幂)&#xff1a;\[C_k \sum_{i \oplus jk}A_iB_i\] 其中\(\oplus\)可以是与&#xff0…

hdu5709-Claris Loves Painting【线段树合并】

正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid5709 题目大意 nnn个点的一棵树&#xff0c;每次有询问(u,k)(u,k)(u,k)表在uuu的子树中&#xff0c;距离uuu不超过kkk的节点中有多少不同颜色的节点。 解题思路 线段树维护每个深度有多少是颜色出现的最浅的位置&am…

【DP】【高精】WZK打雪仗(jzoj 1997)

WZK打雪仗 jzoj 1997 题目大意&#xff1a; 在一个环上有n*2个点&#xff0c;问有多少种连法可以用n条线连接成n对点 输入样例 5输出样例 42解释&#xff1a; 一种可行的方案如下&#xff1a; 数据范围 对于30%数据&#xff1a; n<30。 对于100%数据&#xff1a; …

月旦评 之 DevOps招贤令2018

公元164-182年间&#xff0c;汝南平舆的许氏兄弟于每月初一品评人物&#xff0c;褒贬时政&#xff0c;被称为“月旦评”。所谓“子治世之能臣&#xff0c;乱世之奸雄也”这句许邵评价曹操的话也是来自于“月旦评”&#xff1b;时间一下子来到了2018年&#xff0c;LEANSOFT DevO…

牛客网暑期ACM多校训练营(第九场)

牛客网暑期ACM多校训练营&#xff08;第九场&#xff09; A. Circulant Matrix 做法&#xff1a;看到下标 \(xor\) 这种情况就想 \(FWT\)&#xff0c;可是半天没思路&#xff0c;于是放弃了。。其实这个 \(n\) 疯狂暗示啊。设未知数向量为 \(x\)&#xff0c;列一下方程组就可以…

函数式编程之-模式匹配(Pattern matching)

编者&#xff1a;C# 7.0也加入了模式匹配&#xff0c;来源于F#。模式匹配在F#是非常普遍的&#xff0c;用来对某个值进行分支匹配或流程控制。模式匹配的基本用法模式匹配通过match...with表达式来完成&#xff0c;一个完整的模式表达式长下面的样子&#xff1a;match [somethi…

P4123-[CQOI2016]不同的最小割【网络流,分治】

正题 题目大意:https://www.luogu.com.cn/problem/P4123 题目大意 一张无向图&#xff0c;求所有点对之间有多少不同的最小割。 解题思路 考虑分治的做法&#xff0c;如果我们得知了(s,t)(s,t)(s,t)的最小割www&#xff0c;并且剩下的残量网络中连通点集SSS与sss连通&#x…

【DP】饥饿的WZK(jzoj 1998)

饥饿的WZK jzoj 1988 题目大意&#xff1a; 有很多个点&#xff0c;并且给出n个区间&#xff0c;问在选的区间不重复的前提下&#xff0c;选的区间的点数总和最大是多少 输入样例 3 1 3 7 8 3 4输出样例 5数据范围 对于100%的数据&#xff1a;1<N<2000&#xff0c…

ACM-ICPC 2018 徐州赛区网络预赛 D. EasyMath

ACM-ICPC 2018 徐州赛区网络预赛 D. EasyMath 做法&#xff1a;\[f(m,n) \sum _{i1}^{m} \mu(in) \sum_{i1}^{m}[gcd(i,n)1]\mu(i)\mu(n) \mu(n)\sum_{d|n}\mu(d)f(\frac{m}{d},d)\] 边界: n1&#xff0c;杜教筛求\(\sum_{i1}^{m}\mu(i)\)&#xff0c;m 1, 返回\(\mu(n)\)&…

51nod1601-完全图的最小生成树计数【Trie,分治】

正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId1601 题目大意 nnn个点的完全图&#xff0c;边(i,j)(i,j)(i,j)的权值为aixoraja_i\ xor\ a_jai​ xor aj​。求最小生成树和方案数。 解题思路 对于一个高位数&#xff0c;将这一位为000和这一位为111分…

纪中C组模拟赛总结(2019.7.8)

成绩&#xff1a; 注&#xff1a; rankrankrank是有算其它dalaodalaodalao的 hkydalaohkydalaohkydalao竟不屑于交代码 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4171717wjjwjjwjj185185185100100100858585000000212121lyflyflyf170170170100100100707…

HDU5442

HDU5442 做法&#xff1a;把原串复制一份加在后边&#xff0c;中间插特殊入个特殊字符&#xff0c;再把翻转后的串加在后边&#xff0c;同样复制一份。然后做后缀数组&#xff0c;按题意处理细节即可。 #include <cstdio> #include <iostream> #include <algori…

Asp.Net Core SignalR 与微信小程序交互笔记

什么是Asp.Net Core SignalRAsp.Net Core SignalR 是微软开发的一套基于Asp.Net Core的与Web进行实时交互的类库&#xff0c;它使我们的应用能够实时的把数据推送给Web客户端。功能自动管理连接允许同时广播到所有客户端也可以广播到指定的组或者特定的客户端在Github上开源&am…

手机(jzoj 1983)

手机 jzoj 1983 题目大意&#xff1a; 在手机输入键盘上有很多键&#xff08;如下图&#xff09;&#xff0c;每一个位置按一次就是第一个字母&#xff0c;第二次就是第二个字母&#xff08;空格按0一次&#xff09;&#xff0c;现在问打出一条信息最少按几下&#xff1f; …

P2371-[国家集训队]墨墨的等式【同余最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P2371 题目大意 nnn个aia_iai​&#xff0c;求有多少个b∈[l,r]b\in[l,r]b∈[l,r]满足∑i1naixib\sum_{i1}^na_ix_ib∑i1n​ai​xi​b有正整数解。 解题思路 因为有一个a1a_1a1​在&#xff0c;而且x1x_1x1​可以是任意正整数…