关于Kruskal重构树可以翻阅本人的最小生成树笔记。

这题明显裸的Kruskal重构树。

然后这题限制$\le p$的边不能走,实际上就是要满足走最小边权最大的瓶颈路,于是跑最大生成树,构建Kruskal重构树。

通过倍增跳到最浅祖先位置,就get到了一个点可以走到的点集(子树所有叶子)。这些点里选出一个距离$1$最短的。dijkstra。子树维护$\min_{dis}$即可。

复杂度$O(T(M\log M+Q\log N))$

注意Kruskal重构树的算法并不是特别容易写对。配合上多测,非常恶心。

Details:

  • line67:合并子树的时候是用根来合并的
  • line65:并查集初始化范围要两倍(所有和重构树有关的变量都要两倍空间)
  • 多测清空,旧病。。$father$需要清空,否则line55出错。
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define dbg(x) cerr << #x << " = " << x <<endl
#define dbg2(x,y) cerr<< #x <<" = "<< x <<" "<< #y <<" = "<< y <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=2e5+,INF=0x7a7a7a7a;
int Test,n,m,q,K,S;
struct stothx{int to,nxt,w;}G[N<<],T[N<<];
int Head[N],tot;
inline void Addedge(int x,int y,int z){
G[++tot].to=y,G[tot].nxt=Head[x],Head[x]=tot,G[tot].w=z;
G[++tot].to=x,G[tot].nxt=Head[y],Head[y]=tot,G[tot].w=z;
}
priority_queue<pii,vector<pii>,greater<pii> > pq;
int dis[N<<];
#define y G[j].to
inline void dij(){
memset(dis,0x7a,sizeof dis);pq.push(make_pair(dis[]=,));
while(!pq.empty()){
int d=pq.top().first,x=pq.top().second;pq.pop();
if(d^dis[x])continue;
for(register int j=Head[x];j;j=G[j].nxt)if(MIN(dis[y],d+G[j].w))pq.push(make_pair(dis[y],y));
}
}
#undef y int val[N<<],thead[N<<],ttot,cnt,fa[N<<][],fp[N];
inline void TreeAddedge(int x,int y){
T[++ttot].to=y,T[ttot].nxt=thead[x],thead[x]=ttot;
T[++ttot].to=x,T[ttot].nxt=thead[y],thead[y]=ttot;
}
#define y T[j].to
void dfs(int x,int fat,int d){
fa[x][]=fat;
for(register int k=;k<=fp[d];++k)fa[x][k]=fa[fa[x][k-]][k-];
for(register int j=thead[x];j;j=T[j].nxt)if(y^fat)dfs(y,x,d+),MIN(dis[x],dis[y]);
}
#undef y
inline int Query(int v,int p){for(register int k=;~k;--k)if(val[fa[v][k]]>p)v=fa[v][k];return v;}
//notice that fa[] must be cleared before each test,or errors will occur when k is a litter big,for example k=19,18...
struct thxorz{
int u,v,w;
inline bool operator <(const thxorz&A)const{return w>A.w;}
}e[N<<];
int anc[N<<];
inline int getanc(int x){return anc[x]==x?x:anc[x]=getanc(anc[x]);}
inline void ex_kruskal(){
sort(e+,e+m+);cnt=n;
for(register int i=;i<n<<;++i)anc[i]=i;//notice the range.
for(register int i=;i<=m;++i)if(getanc(e[i].u)^getanc(e[i].v)){//dbg2(anc[e[i].u],anc[e[i].v]);
val[++cnt]=e[i].w;TreeAddedge(anc[e[i].u],cnt),TreeAddedge(anc[e[i].v],cnt);//notice the vertex:anc[...]
anc[anc[e[i].u]]=anc[anc[e[i].v]]=cnt;//dbg2(i,cnt);
}
} int main(){freopen("return.in","r",stdin);freopen("return.out","w",stdout);
for(register int i=;i<=2e5+;++i)fp[i]=__lg(i);
read(Test);while(Test--){
read(n),read(m);
int v,p,las=;
tot=ttot=,memset(Head,,sizeof Head),memset(thead,,sizeof thead),memset(val,,sizeof val),memset(fa,,sizeof fa);
for(register int i=,z;i<=m;++i)read(e[i].u),read(e[i].v),read(z),read(e[i].w),Addedge(e[i].u,e[i].v,z);
dij();ex_kruskal();dfs(*n-,,);
read(q),read(K),read(S);
while(q--){
read(v),read(p);
v=(v+(K?las:)-)%n+,p=(p+(K?las:))%(S+);
printf("%d\n",las=dis[Query(v,p)]);
}
}
return ;
}

总结:瓶颈路题不妨试试Kruskal重构树。

另外再付一道类似的板子题,有空待做。BZOJ3551

loj2718 「NOI2018」归程[Kruskal重构树+最短路]的更多相关文章

  1. #2718. 「NOI2018」归程 kruskal重构树

    链接 https://loj.ac/problem/2718 思路 我们希望x所在的连通块尽量的大,而且尽量走高处 离线的话可以询问排序,kruskal过程中更新答案 在线就要用kruskal重构树 ...

  2. loj#2718. 「NOI2018」归程

    题目链接 loj#2718. 「NOI2018」归程 题解 按照高度做克鲁斯卡尔重构树 那么对于询问倍增找到当前点能到达的高度最小可行点,该点的子树就是能到达的联通快,维护子树中到1节点的最短距离 s ...

  3. 「NOI2018」归程

    「NOI2018」归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 >\(1\) 个节点. \(m\) 条边的无向连通图(节点的编号从 \( ...

  4. NOI Day1T1归程(Kruskal重构树+Dijkstra)

    NOI Day1T1归程(Kruskal重构树+Dijkstra) 题目 洛谷题目传送门 题解 其实我不想写......,所以...... 挖个坑......我以后一定会补的 luogu的题解讲的还是 ...

  5. LOJ #2718. 「NOI2018」归程(Dijkstra + Kruskal重构树 + 倍增)

    题意 给你一个无向图,其中每条边有两个值 \(l, a\) 代表一条边的长度和海拔. 其中有 \(q\) 次询问(强制在线),每次询问给你两个参数 \(v, p\) ,表示在 \(v\) 出发,能开车 ...

  6. [NOI2018]归程 kruskal重构树

    [NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...

  7. [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)

    洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...

  8. LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)

    LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不 ...

  9. BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra

    题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...

随机推荐

  1. 如何写出优雅耐看的JavaScript代码

    参考链接:https://segmentfault.com/a/1190000020444918?utm_medium=hao.caibaojian.com&utm_source=hao.ca ...

  2. PYTHON 100days学习笔记005:总结和练习

    目录 day005:总结和练习 1.寻找水仙花数 2.寻找"完美数" 3."百鸡百钱"问题 4.生成"斐波那契数列" 5.Craps赌博游戏 ...

  3. SQL Server优化技巧——如何避免查询条件OR引起的性能问题

    原文:SQL Server优化技巧--如何避免查询条件OR引起的性能问题 之前写过一篇博客"SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析",里面介绍了OR可能会引起 ...

  4. acm java入门(转载)

    ACM中java的使用 http://www.cnblogs.com/XBWer/archive/2012/06/24/2560532.html 这里指的java速成,只限于java语法,包括输入输出 ...

  5. PHPRedis教程之geo

    前言 支持 GEO 系列命令的 Redis 版本从 3.2.0 起开始才可以使用,所以之前版本就不要想了. 函数列表 geoadd - 将指定的地理空间项(纬度,经度,名称)添加到指定的键, 数据作为 ...

  6. docker入门到放弃

    1.容器简介 Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的cgroup,namespace,Union FS等技术,对应用进程进行封装隔离,并且独立于宿主机与其他进程, ...

  7. 网络名称空间 实例研究 veth处于不同网络的路由问题

    相关命令详细介绍参见 http://www.cnblogs.com/Dream-Chaser/p/7077105.html .问题: 两个网络名称空间中的两个接口veth0和veth1,如何配置net ...

  8. 运用加密技术保护Java源代码(转)

    出处:运用加密技术保护Java源代码 为什么要加密? 对于传统的C或C++之类的语言来说,要在Web上保护源代码是很容易的,只要不发布它就可以.遗憾的是,Java程序的源代码很容易被别人偷看.只要有一 ...

  9. nnginx配置代理服务器

    因为有些服务有ip白名单的限制,部署多节点后ip很容易就不够用了,所以可以将这些服务部署到其中的一些机器上, 并且部署代理服务器,然后其余机器以代理的方式访问服务.开始是以tinyproxy作为代理服 ...

  10. Winfrom 定时锁屏

    #region 锁屏 public struct LASTINPUTINFO { [MarshalAs(UnmanagedType.U4)] public int cbSize; [MarshalAs ...