显然求出每个点到所有关键点的最短路和次短路即可,答案就是每个关键点的次短路。

设$f[i][j][0]$表示左手在$i$,右手在$j$的解,$f[i][j][1]$表示左手在$i$,右手在$j$,且左手已经动了右手还没开始动的解,然后BFS即可。

时间复杂度$O(n(n+m))$。

#include<cstdio>
const int N=1010,M=10010;
int n,m,K,dmi,dma,i,j,k,x,y,z,vip[N][N],ans[N*N],e[2][N],v[M],nxt[M],ed,h,t,q[N*N*4][5];
struct P{int x,y;P(){}P(int _x,int _y){x=_x,y=_y;}}a[N],f[N][N][2],g[N][N][2];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int&x,int y){v[++ed]=y;nxt[ed]=x;x=ed;}
inline int abs(int x){return x>0?x:-x;}
inline bool check(int x,int y){int d=abs(a[x].x-a[y].x)+abs(a[x].y-a[y].y);return dmi<=d&&d<=dma;
}
inline void ext(int x,int y,int z,int a,int b){if(!z&&!check(x,y))return;if(g[x][y][z].y)return;if(f[x][y][z].y==b)return;q[++t][0]=x,q[t][1]=y,q[t][2]=z,q[t][3]=a,q[t][4]=b;if(!f[x][y][z].y)f[x][y][z]=P(a,b);else g[x][y][z]=P(a,b);
}
int main(){read(n),read(m),read(dmi),read(dma);for(i=1;i<=n;i++)read(a[i].x),read(a[i].y);read(K);for(i=1;i<=K;i++)read(x),read(y),vip[x][y]=i;while(m--){read(x),read(y),read(z);add(e[z][x],y),add(e[z][y],x);}for(i=1;i<=n;i++)add(e[0][i],i),add(e[1][i],i);for(h=i=1;i<=n;i++)for(j=1;j<=n;j++)if(vip[i][j])ext(i,j,0,0,vip[i][j]);while(h<=t){x=q[h][0],y=q[h][1],z=q[h][2],j=q[h][3]+1-z,k=q[h++][4];for(i=e[z][z?y:x];i;i=nxt[i])ext(z?x:v[i],z?v[i]:y,z^1,j,k);}for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(vip[i][j])ans[vip[i][j]]=g[i][j][0].y?g[i][j][0].x:-1;for(i=1;i<=K;i++)printf("%d\n",ans[i]);return 0;
}

  

BZOJ3161 : 孤舟蓑笠翁相关推荐

  1. BZOJ3161: 孤舟蓑笠翁

    将一个合法(即哈密顿距离在[dmin,dmax]内)的点对(p,q)视为一个点 问题变成在一个边权全部为1的无向图中,有一些关键点,求每个关键点到离它最近的关键点的距离 这个问题有个经典的bfs做法 ...

  2. [BZOJ3161]孤舟蓑笠翁

    bzoj sol 先预处理每个状态是否合法.记\(dis[i][j]\)表示从任意一个绝招点到达左手在\(i\)右手在\(j\)这个状态的最小步数,以及\(vis[i][j]\)表示是从哪一个绝招点转 ...

  3. 【BFS】lydsy3161 孤舟蓑笠翁

     题目描述很详细了,不多说了.  今天因为很粗心的bug肝到了这么晚,真的惨.  这道题一开始想知道是状态当点,也知道是广搜,但是显然直接广搜会T.想不出来,忍不住查阅了一下题解(天哪我怎么这么菜), ...

  4. bzoj 3161: 孤舟蓑笠翁 bfs

    显然,可以把左手在i点,右手在j点缩成一个状态(想到这个就基本结束了),那么去掉不合法的状态之后,可以根据停顿点的移动条件得到一个状态可以转移到那些状态.这就相当于一个图,而边权都是1,然后要求的就是 ...

  5. 使用openpyxl去操作Excel表格

    对表格的数据写操作: from openpyxl import Workbook wb=Workbook()w1=wb.create_sheet('index',0) # w1["E4&qu ...

  6. 多媒体技术创新开启“科技+文化”新“视”界

    新华网北京10月21日电(盖博铭 王潇蒙)影视公司整合人工智能等技术提升老电影清晰度.全息影像可"还原"文物古迹.自媒体直播开启互动模式--多媒体技术串联起科技创新与文化产业创新, ...

  7. 商女不知亡国恨,一天到晚敲代码

    满园春色关不住 一串代码飘出来. 日照屏幕直冒烟, 遥看代码挂前川. 春眠不觉晓,处处敲代码. 春宵一刻值千金,完事起来敲代码. 洛阳亲友如相问,就说我在敲代码. 夜阑卧听风吹雨,做梦还在敲代码. 举 ...

  8. 三、Python-列表

    三.Python-列表 一.序列:是一块用于存放多个值的连续内存空间,并且按一定顺序排列,可以通过索引取值 索引:从左到右的索引从0开始依次增加的正整数:从右到左的索引为-1开始的复数 切片(分片): ...

  9. Java基础---方法1

    方法1 具有特殊功能的一段代码,可以通过名字重复调用.提高了代码的重用性.封装性,简化程序设计.方法的定义:public static 返回值类型 方法名(形式参数列表) {方法语句;}位置:在类中, ...

最新文章

  1. python root_python在非root权限下的安装方法
  2. tcpdump软件使用
  3. Redis高可用方案-RedisCluster-SpringBoot整合
  4. CF815C Karen and Supermarket [树形DP]
  5. DeepLearningAI 学习笔记 1.3 浅层 logistic 神经网络
  6. 另一个进程已被死锁在资源上且该事务已被选作死锁牺牲品
  7. 云计算年度技术盛典,腾讯Techo Park开发者大会将在京召开
  8. java 中使用_java中运算符的使用方法
  9. VS下使用多字符集编码和Unicode字符集编码的总结
  10. 读书笔记:自动控制原理
  11. shift用计算机,shift是什么意思_shift键有什么用? - 学无忧
  12. 高数 下总复习 完结
  13. Python批量转换文件夹下图片为PDF
  14. 等待指示器(2) -- 网络等待指示器
  15. Win系统 - Windows10 该内存不能为 read
  16. word中图片批量修改
  17. 【强化学习论文合集】二十九.2021国际机器学习大会论文(ICML2021)
  18. Web全栈~27.文件和目录的操作
  19. 2022-2028年全球植入前基因检测收入年复合增长率CAGR为 5.6%
  20. 基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

热门文章

  1. eNSP配置Martini方式VPLS
  2. 什么是零知识证明(ZK Proof)?Web2.0通往Web3.0的入口技术
  3. 台当局死磕美国Uber
  4. 推荐一个数据库文档生成神器
  5. linux 跨平台查询 lxr,利用LXR来生成Linux内核代码的交叉索引页面
  6. 北大正式成立智能学院,AI视觉大牛朱松纯任院长
  7. h5禁用浏览器下载视频_【HTML5】video 标签禁用自带的下载按钮
  8. java zip解压 中文_java解压ZIP 解决中文乱码 (GBK和UTF-8)
  9. LVM动态添加硬盘空间
  10. uni.showToast(OBJECT)消息提示框