[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 下载. ...
随机推荐
- Centos服务器ssh免密登录以及搭建私有git服务器
一.概述 服务器的免密登录和git服务器的搭建,关键都是要学会把自己用的机器的公钥添加到服务器上,让服务器“认识”你的电脑,从而不需要输入密码就可以远程登录服务器上的用户 免密登录当然是登录root用 ...
- nodejs安装express以后,使用express显示不是内部或外部命令
1.问题描述 在命令窗口通过npm install -g express 安装express以后,通过express -e express新建工程失败,提示express不是内部或外部命令 2.解决方 ...
- Opencv模块功能介绍
本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 站在巨 ...
- python实战===图片转换为字符的源码(转)
#cmd执行命令为>>> python xx.py pic.png#-*- coding:utf-8 -*- from PIL import Image import argpars ...
- python基础===requests学习笔记
这里有一个新的学习requests网站:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html2017/11/30 Requ ...
- python基础===一道小学奥数题的解法
今早在博客园和大家分享了一道昨晚微博中看到的小学奥数题,后来有朋友给出了答案.然后我尝试用python解答它. 原题是这样的: 数学题:好事好 + 要做好 = 要做好事,求 “好.事.做.要”的值分别 ...
- 5-3 Linux内核计时、延时函数与内核定时器【转】
转自:http://www.xuebuyuan.com/510594.html 5-3 Linux内核计时.延时函数与内核定时器 计时 1. 内核时钟 1.1 内核通过定时器(timer)中断来跟 ...
- openfire在内网的情况下 文件传输代理的设置
openfire在内网的情况下 文件传输代理的设置 http://blog.csdn.net/v6543210/article/details/22506565
- 动画基础--基于Core Animation(2)
参考:https://zsisme.gitbooks.io/ios-/content/ 前面的文章动画基础--基于Core Animation(1)提到了图层的基本概念以及可动画参数几何学等知识. 本 ...
- JS实现判断滚动条滚到页面底部并执行事件的方法
需要了解三个dom元素,分别是:clientHeight.offsetHeight.scrollTop. clientHeight:这个元素的高度,占用整个空间的高度,所以,如果一个div有滚动条,那 ...