正解:kruscal重构树+bfs

解题报告:

我永远喜欢loj!

感觉这题和这题挺像的,,,预处理和解题方法都是,,,所以大概整体二分能过去?

但因为做这题主要是入门一下kruscal重构树,,,所以还是港kruscal重构树滴解法好了QAQ

首先先说下预处理趴,就怎么知道每个点的水壶大小是多少

这个显然就和我放的链接那题差不多,只是这个是四联通bfs

umm还是说下具体细节趴,,,还是有点儿区别来着QwQ

就对每个点记录离它最近的建筑的编号和距离,然后再拓展到别的建筑的时候就可以连起这两个建筑了

然后就成了kruscal板子了,,,?

就欧克了鸭QwQ

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define sc second
#define il inline
#define gc getchar()
#define mp make_pair
#define pb push_back
#define t(i) edge[i].to
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];i;i=edge[i].nxt) const int N=+,M=+;
int h,w,p,q,nod_cnt,bl[N][N],dis[N][N],mv_x[]={,,,-},mv_y[]={,-,,},fa[M<<],fat[M<<][],ed_cnt,wei[M<<],dep[M<<],head[M<<];
char g[N][N];
struct ed{int to,nxt;}edge[M<<];
pair<int,int>city[M];
vector< pair<int,int> >E[N*N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void bfs()
{
queue< pair<int,int> >Q;
rp(i,,p)Q.push(city[i]),bl[city[i].fi][city[i].sc]=i;
while(!Q.empty())
{
pair<int,int>nw=Q.front();Q.pop();
rp(i,,)
{
pair<int,int>to=mp(nw.fi+mv_x[i],nw.sc+mv_y[i]);
if(g[to.fi][to.sc]=='#' || to.fi< || to.sc< || to.fi>h || to.sc>w)continue;
if(!bl[to.fi][to.sc])Q.push(to),bl[to.fi][to.sc]=bl[nw.fi][nw.sc],dis[to.fi][to.sc]=dis[nw.fi][nw.sc]+;
else E[dis[to.fi][to.sc]+dis[nw.fi][nw.sc]].pb(mp(bl[to.fi][to.sc],bl[nw.fi][nw.sc]));
}
}
}
il void ad(ri y,ri x){edge[++ed_cnt]=(ed){x,head[y]};head[y]=ed_cnt;}
int fd(ri x){return fa[x]==x?x:fa[x]=fd(fa[x]);}
il void kruscal()
{
rp(i,,p)fa[i]=i;nod_cnt=p;
rp(i,,h*w)
{
for(auto j:E[i])
{
ri x=fd(j.fi),y=fd(j.sc);if(x==y)continue;
++nod_cnt;fa[nod_cnt]=fa[x]=fa[y]=nod_cnt;wei[nod_cnt]=i;ad(fat[x][]=nod_cnt,x);ad(fat[y][]=nod_cnt,y);
}
}
rp(i,,)rp(j,,nod_cnt)fat[j][i]=fat[fat[j][i-]][i-];
}
void dfs(ri x){dep[x]=dep[fat[x][]]+;e(i,x)dfs(t(i));}
il int lca(ri x,ri y)
{
if(dep[x]<dep[y])swap(x,y);
my(i,,)if(dep[fat[x][i]]>=dep[y])x=fat[x][i];
if(x==y)return x;
my(i,,)if(fat[x][i]!=fat[y][i])x=fat[x][i],y=fat[y][i];
return fat[x][];
} int main()
{
// freopen(".in","r",stdin);freopen(".out","w",stdout);
h=read();w=read();p=read();q=read();rp(i,,h)scanf("%s",g[i]+);rp(i,,p)city[i].fi=read(),city[i].sc=read();
bfs();kruscal();my(i,nod_cnt,)if(!dep[i])dfs(i);
while(q--)
{
ri x=read(),y=read();if(fd(x)!=fd(y))printf("-1\n");else printf("%d\n",wei[lca(x,y)]);
}
return ;
}

放下代码QwQ

loj2876 水壶 [JOISC 2014 Day2] kruscal重构树的更多相关文章

  1. 『Kruscal重构树 Exkruscal』

    新增一道例题及讲解 Exkruscal \(Exkruscal\)又称\(Kruscal\)重构树,是一种利用经典算法\(Kruscal\)来实现的构造算法,可以将一张无向图重构为一棵具有\(2n-1 ...

  2. kruscal重构树略解

    我们先看一道题:Luogu P4197 Peaks 这道题珂以用启发式合并+主席树来做 那么强制在线呢?(bzoj 3551 [ONTAK2010]Peaks加强版) 离线做法就不行了 我们就要用一个 ...

  3. BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树+dfs序

    BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道 ...

  4. [NOI2018]归程(kruscal重构树)

    [NOI2018]归程 题面太长辣,戳这里 模拟赛上写了一个spfa (关于spfa,它已经死了),然后一个st表水完暴力跑路.考后说是Kruscal重构树或者可持久化并查集???这都是些什么东西.不 ...

  5. $ CometOJ-Contest\#11\ D$ $Kruscal$重构树

    正解:$Kruscal$重构树 解题报告: 传送门$QwQ$ 发现一个图上搞就很麻烦,考虑变为生成树达到原有效果. 因为在询问的时候是要求走到的点编号尽量小,发现这个时候点的编号就成为限制了,于是不难 ...

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

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

  7. 学习笔记:Kruscal 重构树

    网上感觉没有什么很详细 + 证明的讲解啊) 前置:Kruskal 求最小生成树. 这个算法可以将一棵树 / 无向连通图重构成一颗有性质的新树. 算法可以解决一些树上瓶颈边权之类的问题,可以把需要持久化 ...

  8. 【题解】洛谷P1967 [NOIP2013TG] 货车运输(LCA+kruscal重构树)

    洛谷P1967:https://www.luogu.org/problemnew/show/P1967 思路 感觉2013年D1T3并不是非常难 但是蒟蒻还是WA了一次 从题目描述中看出每个点之间有许 ...

  9. LOJ #2876. 「JOISC 2014 Day2」水壶 BFS+最小生成树+倍增LCA

    非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话 ...

随机推荐

  1. vue前端知识点整理

    1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter, ...

  2. csproj文件中copy指令的使用方式

    实际开发中有很多项目需要引用第三方的dll或者资源文件,且文件比较多,在运行时这些文件需要被拷贝到BIN目录. 使用VS自带的"复制到输出目录",似然方便,但是比较不零活,经过多次 ...

  3. Cocos 更新时反复杀进程,导致差异更新失效的Bug

    Cocos 更新时反复杀进程时,差异更新失效的问题: 问题复现步骤: 1.在project.manifest.temp 文件下载成功后,下载Assets资源的时候杀掉进程 2.重启游戏,继续更新时会使 ...

  4. tensorflow 笔记12:函数区别:placeholder,variable,get_variable,参数共享

    一.函数意义: 1.tf.Variable() 变量 W = tf.Variable(<initial-value>, name=<optional-name>) 用于生成一个 ...

  5. 解决通过Nginx转发的服务请求头header中含有下划线的key,其值取不到的问题

    1. 问题 由于在http请求头的头部中设置了一些自定义字段,刚好这些字段中含有下划线,比如bundle_name这种,后端在进去获取头部信息时,发现取不到对应的值 2. 原因及解决办法 分析 首先看 ...

  6. 根据IP查地理位置信息

    IP地址库下载地址: https://www.ipip.net/product/ip.html 使用方式(Python): https://github.com/ipipdotnet/datx-pyt ...

  7. rm -rf python 实现 v0.1

    #coding=utf- import os def join(arr,join_falg): res = "" for a in arr: res += a+join_falg ...

  8. Win10连接远程桌面的时候提示您的凭证不工作该怎么办?

    Win10连接远程桌面的时候提示您的凭证不工作该怎么办?Win10连接远程桌面的时候,提示“您的凭证不工作”.原有保存的远程帐号密码无法使用,导致远程登录系统失败.我这里总结下自己解决的方法,分享给大 ...

  9. 搞明白GOROOT,GOPATH,GOBIN,project目录

    我们接下来一个一个来看关于Go语言中的三个目录的详细解释先通过go env查看go的环境变量(我这里是mac的环境,所以可能和你的不同) localhost:~ zhaofan$ go env GOA ...

  10. Flutter & Dart 安装在window系统

    一.系统环境 flutter最低要求 1,windows7 SP1 64位版本以上,我的系统就是windows 7 sp1 64bit 2,git for windows ,没有安装的需要到这里下载  ...