洛谷P2526 【SHOI2001】小狗散步
原题传送门
题目背景
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。
输出格式:
输出小狗的移动路线。
第一行是经过的点数,第二行依次为经过的点的坐标(直角坐标系)
输入输出样例
4 5
1 4 5 7 5 2 -2 4
-4 -2 3 9 1 2 -1 3 8 -3
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】小狗散步的更多相关文章
- 洛谷P2526 [SHOI2001]小狗散步(二分图匹配)
题目背景 Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点,不过会在给定的N个点和主人相遇.小狗和主人同时从(X1,Y1 ...
- [P2526][SHOI2001]小狗散步
Link: P2526 传送门 Solution: 一道提示非常到位的题目 题面中强调了在两个路径相邻点间只能再去至多一个点,且每个点只计算一次贡献 于是明显可以将原题看作询问在两个不相交点集间最多能 ...
- luoguP2526_[SHOI2001]小狗散步_二分图匹配
luoguP2526_[SHOI2001]小狗散步_二分图匹配 题意: Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点 ...
- SHOI2001 小狗散步
题目传送门 感觉这题最大的难点是发现它的解法是二分图最大匹配 主人的路线是固定的,对于每一段的路线,我们可以枚举小狗想去的景点,如果时间够,我们就将这段路线的起点和小狗想去的点连起来 这样就形成了一个 ...
- [SHOI2001] 小狗散步 - 二分图匹配
考虑到每次与主人相遇之前最多只去一个景点,很容易转化为匹配问题 由于数据很小,我们不妨枚举每个相遇点间隙和每个景点,判断是否来得及,如果来得及就连边 沙雕题搞了二十来分钟,我是憨憨 #include ...
- [luoguP2526] [SHOI2001]小狗散步(二分图最大匹配)
传送门 简直就是模板题啊! #include <cmath> #include <cstdio> #include <cstring> #include <i ...
- luogu2526 [SHOI2001]小狗散步
注意一个景点只能去一次. #include <iostream> #include <cstring> #include <cstdio> #include < ...
- 【洛谷4005】小Y和地铁(搜索)
[洛谷4005]小Y和地铁(搜索) 题面 洛谷 有点长. 题解 首先对于需要被链接的两个点,样例中间基本上把所有的情况都给出来了. 但是还缺了一种从下面绕道左边在从整个上面跨过去在从右边绕到下面来的情 ...
- 【洛谷3674】小清新人渣的本愿(莫队,bitset)
[洛谷3674]小清新人渣的本愿(莫队,bitset) 题面 洛谷,自己去看去,太长了 题解 很显然的莫队. 但是怎么查询那几个询问. 对于询问乘积,显然可以暴力枚举因数(反正加起来也是\(O(n\s ...
随机推荐
- Redis基于主从复制的RCE(redis4.x 5.x)复现
使用docker建立redis 拉取镜像 运行 查看 可以连接,存在未授权 https://github.com/Ridter/redis-rce 发送poc i:正向连接 r:反弹 反弹成功
- 14-Ubuntu-文件和目录命令-查看目录内容-ls-1
1.终端使用技巧 (1)tab键自动补全 (2)按上/下光标键查看使用过的命令 (3)退出当前命令,Ctrl C (4)缩小--Ctrl - ;放大--Ctrl shift + 2.ls 命令--查看 ...
- 003-JavaString数据类型
String类型可以和8中基本数据类型做运算(byte/short/char/int/long/float/double/boolean),且只能是连接运算 1. 区分 连接符 和 “+” 的区别 c ...
- c++11 Thread库写多线程程序
一个简单的使用线程的Demo c++11提供了一个新的头文件<thread>提供了对线程函数的支持的声明(其他数据保护相关的声明放在其他的头文件中,暂时先从thread头文件入手吧),写一 ...
- Leetcode274.H-IndexH指数
原题的中文翻译不是很好,所以给出英文版. Given an array of citations (each citation is a non-negative integer) of a rese ...
- js 阻止事件
event.stopPropagation();//阻止事件冒泡 ,可阻止父类事件的发生 event.preventDefault();//阻止默认行为 如A标签
- NOI2019网络同步赛总结
先说说分数:\(100+20+0+100+0+0=220\) 我果然还是个大蒟蒻-- Day1 比赛之前还在回顾着<灵笼>,时间一到就立刻进入比赛. 快速地浏览了一遍题目,然后开始刚T1. ...
- C++ BASS 实例
#include <iostream> #include <string> #include <map> #include "..\sdk\bass\in ...
- 计数dp+概率+大数——(抽屉问题解的个数)zoj3380
难的地方在于计数dp..给定范围[1,n]的数去填m个位置,要求不能出现超过I个相同的数, 那就用dp[i][j]表示在阶段i,已经填了j个位置的可能解法,那么只要枚举i填的位置数k∈[0,min(j ...
- docker中国区镜像加速
[root@syzyy ~]# vim /etc/docker/daemon.json { "registry-mirros":[ "https://registry.d ...