原题传送门

题目背景

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:

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

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

题解

前置知识二分图

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

建模的方法很容易想到:

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

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

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

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const int INF=1e9+,MAXN=,MAXM=MAXN*MAXN;
  5. struct node{
  6. int X,Y;
  7. }A[MAXN],B[MAXN];
  8. inline double dis(node x,node y){
  9. double ii=x.X-y.X,jj=x.Y-y.Y;
  10. return sqrt(ii*ii+jj*jj);
  11. }
  12. int N,M,ans;
  13. int head[MAXN],to[MAXM],nxt[MAXM],tp;
  14. inline void add(int x,int y){
  15. nxt[++tp]=head[x];
  16. head[x]=tp;
  17. to[tp]=y;
  18. }
  19. int used[MAXN],match[MAXN];
  20. bool dfs(int x){
  21. for(int i=head[x];i;i=nxt[i]){
  22. if(!used[to[i]]){
  23. used[to[i]]=;
  24. if(!match[to[i]]||dfs(match[to[i]])){
  25. match[to[i]]=x;
  26. return ;
  27. }
  28. }
  29. }
  30. return ;
  31. }
  32. int main(){
  33. scanf("%d%d",&N,&M);
  34. for(int i=;i<=N;i++){
  35. scanf("%d%d",&A[i].X,&A[i].Y);
  36. }
  37. for(int i=;i<=M;i++){
  38. scanf("%d%d",&B[i].X,&B[i].Y);
  39. }
  40. for(int i=;i<N;i++){
  41. for(int j=;j<=M;j++){
  42. if(dis(A[i],A[i+])*2.0>=dis(A[i],B[j])+dis(B[j],A[i+])){
  43. add(j,i);
  44. }
  45. }
  46. }
  47. for(int i=;i<=M;i++){
  48. memset(used,,sizeof(used));
  49. ans+=dfs(i);
  50. }
  51. printf("%d\n",ans+N);
  52. for(int i=;i<=N;i++){
  53. printf("%d %d ",A[i].X,A[i].Y);
  54. if(match[i]){
  55. printf("%d %d ",B[match[i]].X,B[match[i]].Y);
  56. }
  57. }
  58. return ;
  59. }

洛谷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. 过滤'and','or' ''' '*' '=' ‘select’下的注入

    遇到一个站:http://www.马赛克.net/intro.aspx?id=6 加了单引号  http://www.马赛克.net/intro.aspx?id=6‘  页面无变化 加了双引号   h ...

  2. CentOS部署软件and so on……

    CentOS各版本系统下载 CentOS下载地址:http://archive.kernel.org/centos-vault/ CentOS安装python3.7.2: 1.安装依赖包 yum in ...

  3. C#中如何实现将字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格

    思路:用空来替换首尾的空格,用一个空格替换中间的连续空格. 例如:string inputStr=” xx xx “; inputStr=inputStr.Trim(); inputStr=Regex ...

  4. liunx crontab 参数代表含义

    * * * * * (下面的字体对应) 分钟 小时 几号 月份 星期几 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作. 逗号(,): ...

  5. vue3+node全栈项目部署到云服务器

    一.前言 最近在B站学习了一下全栈开发,使用到的技术栈是Vue+Element+Express+MongoDB,为了让自己学的第一个全栈项目落地,于是想着把该项目部署到阿里云服务器.经过网上一番搜索和 ...

  6. 【ArcObject】 AxTocControl:实现图层可移动

    设置axTocControl属性:EnableLayerDragDrop 为true即可

  7. java 与日期转换相关的方法(java.util.date类型和java.sql.date类型互相转换)、随机字符串生成方法、UUID生产随机字符串

    package com.oop.util; import java.text.*; import java.util.UUID; import org.junit.Test; /* * 与日期相关的工 ...

  8. arm-linux-gcc 的使用

    1. 编译 C 文件,生成 elf 可执行文件 h1.c 源文件 #include <stdio.h> void hellofirst(void) { printf("The f ...

  9. mantis 添加新状态配置方法

    在mantis的状态栏中一般只有:新建.反馈.认可.已确认.已分派.已解决.已关闭,七个选项,如果想在其中加入新的状态怎么做? 我要加入的状态为:重新打开 1.添加状态信息 打开config_defa ...

  10. django 项目分析

    项目要点 一.功能制定 1.用户功能 #.登陆 #.权限组功能 2.数据展示功能 #.列表展示 #.详细信息展示 #.图标展示 3.资源管理功能 #远程管理 #对远程服务器上的进程具有 #开启 #关闭 ...