正解: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. springboot nginx 配置

    安装nginx参考本人另一篇博客:http://www.cnblogs.com/gmq-sh/p/5750833.html spring-boot需要启动nginx的,用于监听启动的端口.一.配置ng ...

  2. Centos7.4别名设置提高工作效率

    一.打开 .bashrc文件 1.位置:~(cd ~)目录下 2.cat .bashrc 原文件内容如下: # .bashrc # User specific aliases and function ...

  3. BizTalk Schedule Adapter的使用

    由于BizTalk作为一个消息中间件是无状态的,一般不能主动去触发消息.因此在有一些特定的场景,比如每隔X分钟/小时/天去轮询或获取数据时就会特别不方便.不过可以通过Codeplex上的开源项目:Bi ...

  4. PDFBOX详解

    PDFBOX详解 摘要 自从Adobe公司1993年第一次发布公共PDF参考以来,支持各种语言和平台的PDF工具和类库就如雨后春笋般涌现.然而,Java应用开发中Adobe技术的支持相对滞后了. 自从 ...

  5. ICE的异步方法调用

    转自:http://blog.sina.com.cn/s/blog_45497dfa0100nwbr.html http://www.cnblogs.com/mawanglin2008/article ...

  6. mtr命令详解诊断网络路由

    首先安装mtr​# yum -y install mtr ​ ​一般在windows 来判断网络连通性用ping 和tracert, ping的话可以来判断丢包率,tracert可以用来跟踪路由, 在 ...

  7. 乾坤合一~Linux设备驱动之USB主机和设备驱动

    如果不能陪你到最后 是否后悔当初我们牵手 如果当初没能遇见你 现在的我 在哪里逗留 所有的爱都是冒险 那就心甘情愿 等待我们一生中 所有悬念 我一往情深的恋人 她是我的爱人 她给我的爱就像是 带着露水 ...

  8. Linux (OpenBSD)系统目录分析

    IER(7)                    OpenBSD Reference Manual                    HIER(7) NAME      hier - layou ...

  9. osg shader 相机观察矩阵逆矩阵 求顶点世界坐标

    uniform mat4 osg_ViewMatrixInverse;//osg内置uniform void main() { vec4 posWorld = osg_ViewMatrixInvers ...

  10. 【消灭代办】第4周 - Echarts在移动端的各种填坑姿势

    啊呀呀呀呀...... 2018-12-03 代办一:坐标指示器相关问题: 见另一篇 第二问:https://www.cnblogs.com/padding1015/p/9936533.html 20 ...