将一个合法(即哈密顿距离在[dmin,dmax]内)的点对(p,q)视为一个点
问题变成在一个边权全部为1的无向图中,有一些关键点,求每个关键点到离它最近的关键点的距离
这个问题有个经典的bfs做法
将所有关键点加入队列去bfs,每个点第一次被bfs到时标记一下他是被哪个关键点找到的,然后加入队列,这样bfs一次后可以求出每个点到离他最近的关键点的距离以及是哪个关键点(当然一个关键点到离它最近的关键点距离是0),把他纳入这个关键点的势力范围
然后枚举图中的所有边,若它连接的两点不属于同一个势力,就可以拿这两个点去更新这两个关键点的最短距离

code:

#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<complex>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;const int maxn = 1010;
const int maxp = maxn*maxn;int n,m,K,N;
int dmin,dmax;
vector<int>Vr[maxn],Vc[maxn];struct point{int x,y;}p[maxn],ck[maxp],np[maxp];
int dis(int a,int b){return abs(p[a].x-p[b].x)+abs(p[a].y-p[b].y);}
int id[maxn][maxn],cnt;int rea[maxp],bel[maxp];
queue<int>q;int ans[maxp];int main()
{//freopen("tmp.in","r",stdin);//freopen("tmp.out","w",stdout);scanf("%d%d",&n,&m);scanf("%d%d",&dmin,&dmax);for(int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);scanf("%d",&K);for(int i=1;i<=K;i++) scanf("%d%d",&ck[i].x,&ck[i].y);for(int i=1;i<=m;i++){int x,y,ti; scanf("%d%d%d",&x,&y,&ti);if(!ti) Vr[x].push_back(y),Vr[y].push_back(x);else Vc[x].push_back(y),Vc[y].push_back(x);}for(int i=1;i<=n;i++) Vr[i].push_back(i),Vc[i].push_back(i);for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){int d=dis(i,j);if(d>=dmin&&d<=dmax) id[i][j]=++cnt,np[cnt]=(point){i,j};}for(int i=1;i<=cnt;i++) rea[i]=-1;for(int i=1;i<=K;i++){ans[i]=-1;int ii=id[ck[i].x][ck[i].y];rea[ii]=0,bel[ii]=i;q.push(ii);}while(!q.empty()){const int p1=q.front(); q.pop();int x=np[p1].x,y=np[p1].y;for(int i=0;i<Vr[x].size();i++) for(int j=0;j<Vc[y].size();j++){int p2=id[Vr[x][i]][Vc[y][j]];if(!p2) continue;if(rea[p2]==-1) rea[p2]=rea[p1]+1,bel[p2]=bel[p1],q.push(p2);}}for(int x=1;x<=n;x++) for(int y=1;y<=n;y++){int p1=id[x][y],b1=bel[p1]; if(!b1) continue;for(int i=0;i<Vr[x].size();i++) for(int j=0;j<Vc[y].size();j++){int p2=id[Vr[x][i]][Vc[y][j]];int b2=bel[p2]; if(!b2||b1==b2) continue;if(ans[b1]==-1||ans[b1]>rea[p1]+rea[p2]+1) ans[b1]=rea[p1]+rea[p2]+1;if(ans[b2]==-1||ans[b2]>rea[p1]+rea[p2]+1) ans[b2]=rea[p1]+rea[p2]+1;}}for(int i=1;i<=K;i++) printf("%d\n",ans[i]);return 0;
}

BZOJ3161: 孤舟蓑笠翁相关推荐

  1. [BZOJ3161]孤舟蓑笠翁

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

  2. BZOJ3161 : 孤舟蓑笠翁

    显然求出每个点到所有关键点的最短路和次短路即可,答案就是每个关键点的次短路. 设$f[i][j][0]$表示左手在$i$,右手在$j$的解,$f[i][j][1]$表示左手在$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. linux-swappiness参数的作用及设置
  2. /proc/irq和/proc/interrupts详解
  3. table选项卡从A页面点击进入B页面指定版块
  4. ADO.NET Entity Framework建模和映射(实体框架)
  5. 日历2019全年日历表_实施和使用日历表
  6. Python——assert(断言)主进程级的终止判断语句
  7. Java——动态绑定和多态
  8. c#类的方法表的建立和方法的调用
  9. atitit.二进制数据无损转字符串网络传输
  10. pathlib2 Path glob rglob的最新研究成果
  11. php制作闹钟,简易闹钟 - 按键精灵资源站 按键精灵教程,学习脚本制作,脚本大全,视频教程...
  12. 电脑qq浏览器怎么滚动截长图_电脑上如何滚动截屏长图?这样做最简单
  13. prometheus实战(一) 原理介绍
  14. docker的安装教程以及常用命令(一)
  15. linux安装python教程视频_新手开发者的极简Linux上手Python视频教程
  16. 【转】国内人才《上海市居住证》续办需提供的申请材料
  17. 中高级JAVA工程师-面试题汇总
  18. 老白理解的REDO LOG
  19. 维基解密创始人被指控与匿名者LulzSec黑客组织合作
  20. 无头浏览器 html5定位,5.2 使用浏览器无头模式执行Selnium脚本

热门文章

  1. 无论夫妻还是情人,能陪你一生的男人,都有这个特征
  2. 微信小游戏 - Canvas/WebGL Demo 移植
  3. Fllutter TabBar中文文字抖动完美解决方案
  4. Effective C++记录(6):Explicitly disallow the use of compiler-generated functions you do not want
  5. 读研2年,我选择从中科院退学转行写代码
  6. 计算机网络---考前最后一背
  7. 高性能网站建设进阶指南:Web开发者性能优化最佳实践 pdf扫描版
  8. Java电商订单_Java电商项目学习(十) 订单管理模块开发
  9. cpuz检测硬件真假_难道CPU真的没有真假,只有好坏?
  10. 如何查看Android API文档