[P2526][SHOI2001]小狗散步
Link:
Solution:
一道提示非常到位的题目
题面中强调了在两个路径相邻点间只能再去至多一个点,且每个点只计算一次贡献
于是明显可以将原题看作询问在两个不相交点集间最多能连几条边
接下来将合法边连上跑二分图匹配就好了
Tip:二分图匹配时分清$X,Y$集合以及$match$数组是哪个集合的匹配值
Code:
#include <bits/stdc++.h> using namespace std;
typedef pair<int,int> P;
#define X first
#define Y second
const int MAXN=;
P a[MAXN],b[MAXN];
vector<int> G[MAXN];
int n,m,mat[MAXN],vis[MAXN],idx=; int dfs(int x)
{
vis[x]=idx;
for(int i=;i<G[x].size();i++)
{
int v=G[x][i],m=mat[v];
if(m==-||vis[m]!=idx&&dfs(m))
{mat[v]=x;return ;}
}
return ;
} double dist(P a,P b)
{return sqrt((a.X-b.X)*(a.X-b.X)+(a.Y-b.Y)*(a.Y-b.Y));} int main()
{
memset(mat,-,sizeof(mat));
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++)
{
double d=dist(a[i],a[i-]);
for(int j=;j<=m;j++)
if(*d>=dist(a[i],b[j])+dist(a[i-],b[j]))
G[j].push_back(i);
} int res=;
for(int i=;i<=m;i++,idx++) res+=dfs(i);
printf("%d\n",res+n);
for(int i=;i<=n;i++)
{
if(mat[i]!=-)
printf("%d %d ",b[mat[i]].X,b[mat[i]].Y);
printf("%d %d ",a[i].X,a[i].Y);
}
return ;
}
[P2526][SHOI2001]小狗散步的更多相关文章
- 洛谷P2526 [SHOI2001]小狗散步(二分图匹配)
题目背景 Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点,不过会在给定的N个点和主人相遇.小狗和主人同时从(X1,Y1 ...
- 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 < ...
- 洛谷P2526 【SHOI2001】小狗散步
原题传送门 题目背景 Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点,不过会在给定的N个点和主人相遇.小狗和主人同时从 ...
- 用画小狗的方法来解释Java中的值传递
在开始看我画小狗之前,咱们先来看道很简单的题目: 下面程序的输出是什么? Dog myDog = new Dog("旺财"); changeName(myDog); System. ...
- HTML5 Canvas 奔跑的小狗
效果如上图,共六个图像切换,形成小狗动态奔跑效果.完整代码和图片请从 https://files.cnblogs.com/files/xiandedanteng/runningDog.rar 下载. ...
随机推荐
- 【转载】Quick-Cocos2d-x文件结构分析
在上一章我们讲过了Quick-Cocos2d-x中的环境搭建,这章我们分析下quick中的文件结构吧!打开quick的文件夹,可以看到如下的这些目录和文件: bin:存放各种与引擎相关的脚本 comp ...
- 9、MySQL常见的函数?
请参考下面的博客文章: MySQL常见的函数
- 中南oj String and Arrays
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?cid=2072&pid=1 Problem B: String and Arrays T ...
- js中的for in 循环
1.数组 使用for in 遍历数组时,其索引被视为对象的属性,从而直接输出数组的索引 var arr = ["a","b","c"]; f ...
- IBM InfoSphere DataStage and QualityStage
Info coms from https://www.ibm.com/support/knowledgecenter/en/SSZJPZ_9.1.0/com.ibm.swg.im.iis.ds.nav ...
- ARM中断向量表与响应流程【转】
转自:http://blog.csdn.net/honour2sword/article/details/40213417 一首先中断向量表定义在哪里?如何加载? 二 中断向量表与中断服务程序 三处理 ...
- C基础 大文件读取通过标准库
引言 - 问题的构建 C大部分读取文件的时候采用fgetc, 最近在使用过程中发现性能不是很理想.都懂得fgetc每次只能读取一个字符, IO操作太频繁. 所以性能低. 本文希望通过标准库函数frea ...
- 【LabVIEW技巧】策略模式
前言 在之前的文章提到了如何学习OOP以及对应的简单工厂模式,由于时间比较长,我们先回顾一下原有内容,然后继续了解新的模式. 为什么学习OOP 在测控系统的软件开发过程中,LabVIEW工程师一直认为 ...
- .NET直接编译成本地代码:.NET Native架构简介
原文地址:http://blog.csdn.net/atfield/article/details/23449089
- django给视图添加缓存功能
在开发过程中,有些视图只是查询数据,而且查询的数据一般不会变化.例如,做地址模块时,省市县都是不会变的.如果用户每次请求地址视图时,都要执行视图返回数据,会给服务端带来不必要的压力.这时候可以用到缓存 ...