loj2876 水壶 [JOISC 2014 Day2] kruscal重构树
正解:kruscal重构树+bfs
解题报告:
感觉这题和这题挺像的,,,预处理和解题方法都是,,,所以大概整体二分能过去?
但因为做这题主要是入门一下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重构树的更多相关文章
- 『Kruscal重构树 Exkruscal』
新增一道例题及讲解 Exkruscal \(Exkruscal\)又称\(Kruscal\)重构树,是一种利用经典算法\(Kruscal\)来实现的构造算法,可以将一张无向图重构为一棵具有\(2n-1 ...
- kruscal重构树略解
我们先看一道题:Luogu P4197 Peaks 这道题珂以用启发式合并+主席树来做 那么强制在线呢?(bzoj 3551 [ONTAK2010]Peaks加强版) 离线做法就不行了 我们就要用一个 ...
- BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树+dfs序
BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道 ...
- [NOI2018]归程(kruscal重构树)
[NOI2018]归程 题面太长辣,戳这里 模拟赛上写了一个spfa (关于spfa,它已经死了),然后一个st表水完暴力跑路.考后说是Kruscal重构树或者可持久化并查集???这都是些什么东西.不 ...
- $ CometOJ-Contest\#11\ D$ $Kruscal$重构树
正解:$Kruscal$重构树 解题报告: 传送门$QwQ$ 发现一个图上搞就很麻烦,考虑变为生成树达到原有效果. 因为在询问的时候是要求走到的点编号尽量小,发现这个时候点的编号就成为限制了,于是不难 ...
- 洛谷$P4768\ [NOI2018]$归程 $kruscal$重构树
正解:$kruscal$重构树 解题报告: 传送门$QwQ$ 语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$ 所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海 ...
- 学习笔记:Kruscal 重构树
网上感觉没有什么很详细 + 证明的讲解啊) 前置:Kruskal 求最小生成树. 这个算法可以将一棵树 / 无向连通图重构成一颗有性质的新树. 算法可以解决一些树上瓶颈边权之类的问题,可以把需要持久化 ...
- 【题解】洛谷P1967 [NOIP2013TG] 货车运输(LCA+kruscal重构树)
洛谷P1967:https://www.luogu.org/problemnew/show/P1967 思路 感觉2013年D1T3并不是非常难 但是蒟蒻还是WA了一次 从题目描述中看出每个点之间有许 ...
- LOJ #2876. 「JOISC 2014 Day2」水壶 BFS+最小生成树+倍增LCA
非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话 ...
随机推荐
- linux内核剖析(七)Linux进程间通信的几种方式总结
进程间通信概述 进程通信的目的 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另 ...
- window.print控制打印样式
我们可能会去使用window.print()方法来打印页面,但是当我们遇到需要改变打印时候的字体大小等css样式的时候你可能会懵逼. 所以搜索成了我们的必经之路,我相信在网上搜索出来的最好的答案就是使 ...
- Atitit 最近资料文章列表r9 r8 月份 attilax总结
Atitit 最近资料文章列表r9 r8 月份 attilax总结 atitit tag标签标示规范 attilax总结 v2 r922.docx 2017-09-28 02:04 阅读(27) ...
- Asp.Net百度站长工具的主动推送功能
public static string PostUrl(string[] urls) { try { string formUrl = "http://data.zz.baidu.com/ ...
- Word Embedding/RNN/LSTM
Word Embedding Word Embedding是一种词的向量表示,比如,对于这样的"A B A C B F G"的一个序列,也许我们最后能得到:A对应的向量为[0.1 ...
- [转]让iframe自适应高度-真正解决
原文地址:https://www.cnblogs.com/rogge7/p/7762052.html 需求:实现 iframe 的自适应高度,能够随着页面的长度自动的适应以免除页面和 iframe 同 ...
- 理解、学习与使用 JAVA 中的 OPTIONAL<转>
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都 ...
- SudaMod-81.0 / crDroidAndroid-8.1(android-8.1.0_r20)红米3 2018年5月3日更新
一.写在前面 我只是个人爱好,本ROM未集成任何第三方推广软件,我只是喜欢把好的资源分享出来,若可以,我们一起学习,一起进步. 请不要问我怎么刷机! 请不要问我玩游戏卡不卡(有钱你就换好点的手机)! ...
- jquery九大选择器的用法举例
1:基本选择器 改变 id 为 one 的元素的背景色为 #0000FF" $("#one").css("background","#000 ...
- [JVM] IDEA集成VisualVM
VisualVM是集成命令行JDK工具和轻量级分析功能的可视化工具. 参考: https://blog.csdn.net/qq_22741461/article/details/80451675 ht ...