原题传送门

题目背景

Grant喜欢带着他的小狗Pandog散步。Grant以一定的速度沿着固定路线走,该路线可能自交。Pandog喜欢游览沿途的景点,不过会在给定的N个点和主人相遇。小狗和主人同时从(X1,Y1)点出发,并同时在(Xn,Yn)点汇合。小狗的速度最快是Grant的两倍。当主人从一个点以直线走向另一个点时,Pandog跑向一个它感兴趣的景点。Pandog每次与主人相遇之前最多只去一个景点。

题目描述

你现在的任务是:为Pandog寻找一条路线(有可能与主人的路线部分相同),使它能够游览最多的景点,并能够准时与主人在给定地点相遇或者汇合。

输入输出格式

输入格式:

输入文件第一行是两个整数N和M( 1≤N,M≤100 );

输入文件第二行的N个坐标给出了Grant的散步路线,即Pandog和主人相遇地点;

输入文件第三行的M个坐标给出了所有Pandog感兴趣的景点。

所有输入的坐标均不相同,且绝对值不超过1000。

输出格式:

输出小狗的移动路线。

第一行是经过的点数,第二行依次为经过的点的坐标(直角坐标系)

输入输出样例

输入样例#1:

4 5
1 4 5 7 5 2 -2 4
-4 -2 3 9 1 2 -1 3 8 -3
输出样例#1:

6
1 4 3 9 5 7 5 2 1 2 -2 4

题解

前置知识二分图

这道题是要求输出方案的二分图匹配问题的模板题,思维难度不高,代码简单。

建模的方法很容易想到:

我们将景点作为左集合的元素,将每两个集合点见的空隙作为右集合的元素,

至于连边,我们只需要枚举每两个集合点见的空隙,再枚举每一个景点,如果来得及游玩就在两个点之间连边

最终询问的结果就是N+最大匹配数。

至于如何输出方案,只需要枚举并输出每一个集合点,如果该点与下一个点的空隙被匹配到了,就输出匹配到的景点

 #include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF=1e9+,MAXN=,MAXM=MAXN*MAXN;
struct node{
int X,Y;
}A[MAXN],B[MAXN];
inline double dis(node x,node y){
double ii=x.X-y.X,jj=x.Y-y.Y;
return sqrt(ii*ii+jj*jj);
}
int N,M,ans;
int head[MAXN],to[MAXM],nxt[MAXM],tp;
inline void add(int x,int y){
nxt[++tp]=head[x];
head[x]=tp;
to[tp]=y;
}
int used[MAXN],match[MAXN];
bool dfs(int x){
for(int i=head[x];i;i=nxt[i]){
if(!used[to[i]]){
used[to[i]]=;
if(!match[to[i]]||dfs(match[to[i]])){
match[to[i]]=x;
return ;
}
}
}
return ;
}
int main(){
scanf("%d%d",&N,&M);
for(int i=;i<=N;i++){
scanf("%d%d",&A[i].X,&A[i].Y);
}
for(int i=;i<=M;i++){
scanf("%d%d",&B[i].X,&B[i].Y);
}
for(int i=;i<N;i++){
for(int j=;j<=M;j++){
if(dis(A[i],A[i+])*2.0>=dis(A[i],B[j])+dis(B[j],A[i+])){
add(j,i);
}
}
}
for(int i=;i<=M;i++){
memset(used,,sizeof(used));
ans+=dfs(i);
}
printf("%d\n",ans+N);
for(int i=;i<=N;i++){
printf("%d %d ",A[i].X,A[i].Y);
if(match[i]){
printf("%d %d ",B[match[i]].X,B[match[i]].Y);
}
}
return ;
}

洛谷P2526 【SHOI2001】小狗散步的更多相关文章

  1. 洛谷P2526 [SHOI2001]小狗散步(二分图匹配)

    题目背景 Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点,不过会在给定的N个点和主人相遇.小狗和主人同时从(X1,Y1 ...

  2. [P2526][SHOI2001]小狗散步

    Link: P2526 传送门 Solution: 一道提示非常到位的题目 题面中强调了在两个路径相邻点间只能再去至多一个点,且每个点只计算一次贡献 于是明显可以将原题看作询问在两个不相交点集间最多能 ...

  3. luoguP2526_[SHOI2001]小狗散步_二分图匹配

    luoguP2526_[SHOI2001]小狗散步_二分图匹配 题意: Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点 ...

  4. SHOI2001 小狗散步

    题目传送门 感觉这题最大的难点是发现它的解法是二分图最大匹配 主人的路线是固定的,对于每一段的路线,我们可以枚举小狗想去的景点,如果时间够,我们就将这段路线的起点和小狗想去的点连起来 这样就形成了一个 ...

  5. [SHOI2001] 小狗散步 - 二分图匹配

    考虑到每次与主人相遇之前最多只去一个景点,很容易转化为匹配问题 由于数据很小,我们不妨枚举每个相遇点间隙和每个景点,判断是否来得及,如果来得及就连边 沙雕题搞了二十来分钟,我是憨憨 #include ...

  6. [luoguP2526] [SHOI2001]小狗散步(二分图最大匹配)

    传送门 简直就是模板题啊! #include <cmath> #include <cstdio> #include <cstring> #include <i ...

  7. luogu2526 [SHOI2001]小狗散步

    注意一个景点只能去一次. #include <iostream> #include <cstring> #include <cstdio> #include < ...

  8. 【洛谷4005】小Y和地铁(搜索)

    [洛谷4005]小Y和地铁(搜索) 题面 洛谷 有点长. 题解 首先对于需要被链接的两个点,样例中间基本上把所有的情况都给出来了. 但是还缺了一种从下面绕道左边在从整个上面跨过去在从右边绕到下面来的情 ...

  9. 【洛谷3674】小清新人渣的本愿(莫队,bitset)

    [洛谷3674]小清新人渣的本愿(莫队,bitset) 题面 洛谷,自己去看去,太长了 题解 很显然的莫队. 但是怎么查询那几个询问. 对于询问乘积,显然可以暴力枚举因数(反正加起来也是\(O(n\s ...

随机推荐

  1. 拾遗:{rpm、yum及源码方式管理软件包}

    一.yum配置文件位置 /etc/yum.conf /etc/yum.repos.d/*.repo 二.yum常用命令 install pkgs reinstall pkgs update pkgs ...

  2. Function(高阶函数式编程)

    Function一个可以进行高阶函数式编程的模块. chain def chain[a](fs: Seq[(a) ? a]): (a) ? a 把一些列的方法串起来,挨个执行,每个方法的结果,回作为下 ...

  3. JavaScript学习总结(七)——ECMAScript6(ES6)

    一.ECMAScript概要 ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)通 ...

  4. 如何去掉vue路由中的#

    通过脚手架vue-cli构建的项目,在项目启动后,URL地址上都会带有#,如:http://localhost:8080/#/father 原因:这是因为vue-router 默认hash模式, 使用 ...

  5. HTML语法检测

    网络上收集到的资源: HTML在线编辑//////////////////////////////////////////http://tool.oschina.net/codeformat/ 文本框 ...

  6. linux 服务器安装php5.6

    查看原有的php版本:php -v 如果已经装了低版本的php,为了避免冲突,查看: yum list installed | grep php 删除:自行百度吧.可能不能一次性全部删除,只能一个一个 ...

  7. 当对象转换成JSON的时候处理时间格式

    /// <summary> /// 格式化日期 /// </summary> /// <param name="foramt">格式化规则< ...

  8. 浏览器自带记忆功能,使input颜色和字体丢失

    方法一 : 会有视觉上颜色的变化input:-internal-autofill-selected { /*内置阴影填充 背景颜色*/ box-shadow: inset 0 0 0 1000px # ...

  9. delphi 用户可以点击格式修改进行模板修改

    过程 TlistRepAdd.Btn_GCListRepEditClick窗口 TlistRepAdd 补打流程单 1. 给用户权限 呈现出格式修改按钮 procedure TlistRepAdd.B ...

  10. 新知道一个 端对端加密 Signal protocol

    看 socketio Sponsors 列表中的小蓝鸟,发现网站中有使用 x-jquery-tmpl [翻译]WhatsApp 加密概述(技术白皮书) 知道一个叫 Signal 协议 的端对端加密 端 ...