传送门

前置技能,克鲁斯卡尔重构树

我们按道路的高度建一个最大生成树,然后建好克鲁斯卡尔重构树

那么我们需要知道一颗子树内到1点距离最近是多少(除此之外到子树内任何一个点都不需要代价)

可以一开始直接跑一个dijkstra(关于SPFA,他死了)

然后一遍树形dp就可以了

 //minamoto
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,:;}
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
inline void print(int x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=;
struct EE{
int u,v,h;
EE(){}
EE(int u,int v,int h):u(u),v(v),h(h){}
inline bool operator <(const EE &b)const
{return h>b.h;}
}E[N];
struct node{
int u,dis;
node(){}
node(int u,int dis):u(u),dis(dis){}
inline bool operator <(const node &b)const
{return dis>b.dis;}
};
int head[N],Next[N],ver[N],edge[N],tot;
int hc[N],nc[N],vc[N],tc;
int val[N],f[N][],fa[N],dis[N],vis[N],mn[N],bin[];
int n,m,ans,k;
priority_queue<node> q;
inline void clear(){
memset(head,,sizeof(head)),tot=;
memset(hc,,sizeof(hc)),tc=;
memset(mn,0x3f,sizeof(mn));
memset(f,,sizeof(f));
}
inline void add(int u,int v,int e){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
}
inline void addc(int u,int v){
vc[++tc]=v,nc[tc]=hc[u],hc[u]=tc;
}
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline void mission(int u){
for(int i=;bin[i]<=n;++i)
f[u][i]=f[f[u][i-]][i-];
}
void dijkstra(int s=){
memset(vis,,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
q.push(node(s,)),dis[s]=;
while(!q.empty()){
int u=q.top().u;q.pop();
if(vis[u]) continue;
vis[u]=;
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(cmin(dis[v],dis[u]+edge[i])) q.push(node(v,dis[v]));
}
}
memcpy(mn+,dis+,sizeof(int)*(n));
}
void dfs(int u){
mission(u);
for(int i=hc[u];i;i=nc[i]){
int v=vc[i];
dfs(v),cmin(mn[u],mn[v]);
}
}
inline int query(int u,int x){
for(int i=;~i;--i)
if(f[u][i]&&val[f[u][i]]>x) u=f[u][i];
return mn[u];
}
void kruskal(){
int cnt=n;
for(int i=;i<=(n<<);++i) fa[i]=i;
sort(E+,E++m);
for(int i=;i<=m;++i){
int u=find(E[i].u),v=find(E[i].v);
if(u!=v){
val[++cnt]=E[i].h;
f[u][]=f[v][]=cnt,fa[u]=fa[v]=cnt;
addc(cnt,u),addc(cnt,v);
if(cnt-n==n-) break;
}
}
dfs(cnt);
}
int main(){
// freopen("testdata.in","r",stdin);
int T=read();
bin[]=;for(int i=;i<=;++i) bin[i]=bin[i-]<<;
while(T--){
n=read(),m=read(),ans=;
clear();
for(int i=,u,v,e,h;i<=m;++i){
u=read(),v=read(),e=read(),h=read(),E[i]=EE(u,v,h);
add(u,v,e),add(v,u,e);
}
dijkstra();
kruskal();
int q=read(),k=read(),s=read();
while(q--){
int u=(k*ans+read()-)%n+,v=(k*ans+read())%(s+);
print(ans=query(u,v));
}
}
Ot();
return ;
}

洛谷P4768 [NOI2018]归程(克鲁斯卡尔重构树+最短路)的更多相关文章

  1. 洛谷 P1967 货车运输(克鲁斯卡尔重构树)

    题目描述 AAA国有nn n座城市,编号从 11 1到n nn,城市之间有 mmm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qqq 辆货车在运输货物, 司机们想知道每辆车在不超过车 ...

  2. P4768 [NOI2018]归程(kruskal 重构树)

    洛谷P4768 [NOI2018]归程 LOJ#2718.「NOI2018」归程 用到 kruskal 重构树,所以先说这是个啥 显然,这和 kruskal 算法有关系 (废话 这个重构树是一个有点权 ...

  3. Luogu P4768 [NOI2018]归程(Dijkstra+Kruskal重构树)

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

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

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

  5. 洛谷P4768 [NOI2018]归程(Kruskal重构树)

    题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...

  6. 洛谷$P4768\ [NOI2018]$归程 $kruscal$重构树

    正解:$kruscal$重构树 解题报告: 传送门$QwQ$ 语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$ 所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海 ...

  7. 洛谷 P4768 [NOI2018]归程

    洛谷 361行代码的由来 数据分治大发好啊- NOI的签到题,可怜我在家打了一下午才搞了80分. 正解应该是kruskal重构树或排序+可持久化并查集. 我就分点来讲暴力80分做法吧(毕竟正解我也没太 ...

  8. 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]

    题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...

  9. 洛谷P4768 [NOI2018]归程(可持久化并查集,最短路)

    闲话 一个蒟蒻,在网络同步赛上进行了这样的表演-- T2组合计数不会,T3字符串数据结构不会,于是爆肝T1 一开始以为整个地图都有车,然后写了2h+的树套树,终于发现样例过不去 然后写可持久化并查集D ...

随机推荐

  1. 小程序开发之xxx is not defined

    遇到问题 在小程序开发中直接在函数中调用data中的变量直接赋值给新的变量,就会出现如下错误 VM33895:1 thirdScriptErrorapaymoney is not defined; [ ...

  2. 20145239 实验一 Java开发环境的熟悉(Windows + IDEA)

    实验一 Java开发环境的熟悉(Windows + IDEA) 实验内容 1.使用JDK编译.运行简单的Java程序:2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验知识点 1.JV ...

  3. 深入浅出 - Android系统移植与平台开发(七)- 初识HAL【转】

    本文转载自:http://blog.csdn.net/mr_raptor/article/details/8069588 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   ...

  4. poj The Settlers of Catan( 求图中的最长路 小数据量 暴力dfs搜索(递归回溯))

    The Settlers of Catan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1123   Accepted: ...

  5. struts2的结果类型

    1.从struts-default.xml入手,得到结果类型列表以及对应的处理类: <result-types> <!-- 转发到action --> <result-t ...

  6. mybatis传递多个参数值(转)

    Mybatis传递多个参数   ibatis3如何传递多个参数有两个方法:一种是使用Map,另一种是使用JavaBean. <!--      使用HashMap传递多个参数      para ...

  7. VC Q&A (原创)

    Q1:External Dependencies有什么作用? A1:(网友答复:)External   Dependencies是说你没有把这个文件加入到这个工程中,但是需要这个文件的支持.当然有时是 ...

  8. linux命令学习笔记(32):gzip命令

    减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间. gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip不仅可以 ...

  9. python程序打包工具 ── cx_Freeze

    cx_Freeze是一个类似py2exe的工具,它们区别是py2exe是将python程序打包成windows下可以执行的exe文件的,而cx_Freeze则是将python程序打包为linux下可以 ...

  10. zjoi2015d1题解

    闲来无事做了丽洁姐姐的题 t1给一棵树 每个点有点权 每次修改点权 修改后询问每个点到树的带权重心的带权距离是多少 每个点度数不超过20 很显然的一个点分树... 我们记一下 每个点的子树中的所有点到 ...