luoguP4768 [NOI2018]归程
kruskal重构树:
kruskal合并两个联通块时合并的边一定是联通块中权值最大的边,小于等于这条边的边所能联通的所有点在这个联通块中。
在合并两个联通块的时候新建一个点作为两个联通块代表点的父亲,权值为这条合并的边,那么从一个点x往上跳到最靠上的权值小于等于v的祖先,这个祖先的所有叶子节点就是从x走小于等于v的边能到达的点的集合。
所以这题以1为起点跑dijkstra找单源最短路,然后按权值从大到小排序kruskal重构树即可。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define inf 1e18
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int T,n,m,Q,K,S; template<typename T> void read(T &x) {
char ch=getchar(); T f=; x=;
while((ch!='-')&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct edge {
int u,v,l,a;
edge(){}
edge(int u,int v,int a):u(u),v(v),a(a){}
friend bool operator <(const edge&A,const edge&B) {
return A.a>B.a;
}
}e[N]; int ec,fir[N],nxt[N],to[N],val[N];
void add(int u,int v,int w) {
nxt[++ec]=fir[u]; fir[u]=ec; to[ec]=v; val[ec]=w;
nxt[++ec]=fir[v]; fir[v]=ec; to[ec]=u; val[ec]=w;
} int fa[N];
int find(int x) { return x==fa[x]?x:fa[x]=find(fa[x]); } int f[N][],vv[N]; int ec2,fi[N],nx[N],tt[N];
void ADD(int u,int v) {
nx[++ec2]=fi[u]; fi[u]=ec2; tt[ec2]=v;
} LL fans[N],dis[N];
void dfs(int x,int F) {
f[x][]=F;
fans[x]=inf;
if(x<=n) fans[x]=dis[x];
For(i,,) f[x][i]=f[f[x][i-]][i-];
for(int i=fi[x];i;i=nx[i]) {
dfs(tt[i],x);
fans[x]=min(fans[x],fans[tt[i]]);
}
} int totnode;
void kruskal(int n) {
sort(e+,e+m+);
totnode=n;
For(i,,n*) fa[i]=i;
For(i,,m) {
int x=e[i].u,y=e[i].v;
int fx=find(x),fy=find(y);
if(fx!=fy) {
totnode++;
vv[totnode]=e[i].a;
ADD(totnode,fx); ADD(totnode,fy);
fa[fx]=fa[fy]=totnode;
}
}
dfs(totnode,);
} struct node {
int u; LL d;
node(int u,LL d):u(u),d(d){}
friend bool operator <(const node&A,const node&B) {
return A.d>B.d;
}
}; priority_queue<node>que;
int vis[N];
void dijkstra(int s) {
For(i,,n) dis[i]=inf,vis[i]=;
dis[s]=;
que.push(node(s,));
while(!que.empty()) {
node tp=que.top();
que.pop();
if(vis[tp.u]||dis[tp.u]!=tp.d) continue;
vis[tp.u]=;
for(int i=fir[tp.u];i;i=nxt[i]) {
int y=to[i];
if(dis[y]>dis[tp.u]+val[i]) {
dis[y]=dis[tp.u]+val[i];
que.push(node(y,dis[y]));
}
}
}
} void init() {
ec=ec2=;
memset(fir,,sizeof(fir));
memset(fi,,sizeof(fi));
} int main() {
#ifdef ANS
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
read(T);
while(T--) {
init();
read(n); read(m);
For(i,,m) {
int u,v,l,a;
read(u); read(v); read(l); read(a);
add(u,v,l);
e[i]=edge(u,v,a);
}
dijkstra();
kruskal(n);
read(Q); read(K); read(S);
LL ans=;
while(Q--) {
int v0,p0;
read(v0); read(p0);
int x=(v0+ans%n*K%n-)%n+;
int p=(p0+ans%(S+)*K%(S+))%(S+);
Rep(i,,) if(f[x][i]&&vv[f[x][i]]>p)
x=f[x][i];
ans=fans[x];
printf("%lld\n",ans);
}
}
Formylove;
}
luoguP4768 [NOI2018]归程的更多相关文章
- [NOI2018]归程 kruskal重构树
[NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- NOI2018 D1T1 [NOI2018]归程 解题报告
P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...
- BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增+最短路
BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增 Description www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf 好久不 ...
- 题解 NOI2018 归程
题解 NOI2018 归程 题意 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l, ...
- [NOI2018]归程(kruscal重构树)
[NOI2018]归程 题面太长辣,戳这里 模拟赛上写了一个spfa (关于spfa,它已经死了),然后一个st表水完暴力跑路.考后说是Kruscal重构树或者可持久化并查集???这都是些什么东西.不 ...
- [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树)
[luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树) 题面 题面较长,这里就不贴了 分析 看到不能经过有积水的边,即不能经过边权小于一定值的边,我们想到了kru ...
- Luogu P4768 [NOI2018]归程(Dijkstra+Kruskal重构树)
P4768 [NOI2018]归程 题面 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点. \(m\) 条边的无向连通图(节点的编 ...
- P4768 [NOI2018]归程(kruskal 重构树)
洛谷P4768 [NOI2018]归程 LOJ#2718.「NOI2018」归程 用到 kruskal 重构树,所以先说这是个啥 显然,这和 kruskal 算法有关系 (废话 这个重构树是一个有点权 ...
随机推荐
- zabbix 发送邮件到企业微信
#!/usr/bin/python2.7#_*_coding:utf-8 _*_#auther:拿来用用import requests,sys,jsonimport urllib3urllib3.di ...
- delphi动态创建控件
动态创建控件 其实动态创建控件很简单,相信看过本文后你会全明白的. 1 先在单元的initialization 部分注册它,(这样在单元使用时会自动注册的)如: RegisterClass( TBut ...
- Zookeeper集群介绍及其搭建
1 Zookeeper集群简介 1为什么搭建Zookeeper集群 大部分分布式应用需要一个主控.协调器或者控制器来管理物理分布的子进程.目前,大多数都要开发私有的协调程序,缺乏一个通用机制,协调程序 ...
- (转)OpenFire源码学习之十:连接管理(上)
转:http://blog.csdn.net/huwenfeng_2011/article/details/43415827 关于连接管理分为上下两部分 连接管理 在大并发环境下,连接资源 需要随着用 ...
- 第十四届华中科技大学程序设计竞赛 K--Walking in the Forest
链接:https://www.nowcoder.com/acm/contest/106/K来源:牛客网 题目描述 It’s universally acknowledged that there’re ...
- Python 多线程同步队列模型
Python 多线程同步队列模型 我面临的问题是有个非常慢的处理逻辑(比如分词.句法),有大量的语料,想用多线程来处理. 这一个过程可以抽象成一个叫“同步队列”的模型. 具体来讲,有一个生产者(Dis ...
- JAVA中 成员变量和和实例变量区别
java语言支持的变量类型 类变量:独立于方法之外的变量,用 static 修饰. 局部变量:类的方法中的变量. 实例变量(全局变量):独立于方法之外的变量,不过没有 static 修饰. publi ...
- 搭建单机版spark
二.下载软件 JDK,Scala,SBT,Maven 版本信息如下: JDK jdk-7u79-linux-x64.gz Scala scala-2.10.5.tgz 三.解压上述文件并进行环境变量配 ...
- 本地JAR包打入本地mvn仓库
新建目录my-lib,将jar包移动到目录中,添加pom文件(用alipay测试) <project xmlns="http://maven.apache.org/POM/4.0.0& ...
- java发带图片正文和附件的邮件mail
package com.mail; import java.io.UnsupportedEncodingException; import java.util.Date; import java.ut ...