[P2526][SHOI2001]小狗散步

Link:

P2526 传送门

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=105;
P a[MAXN],b[MAXN];
vector<int> G[MAXN];
int n,m,mat[MAXN],vis[MAXN],idx=1;

int dfs(int x)
{
    vis[x]=idx;
    for(int i=0;i<G[x].size();i++)
    {
        int v=G[x][i],m=mat[v];
        if(m==-1||vis[m]!=idx&&dfs(m))
        {mat[v]=x;return 1;}
    }
    return 0;
}

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,-1,sizeof(mat));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i].X,&a[i].Y);
    for(int i=1;i<=m;i++)
        scanf("%d%d",&b[i].X,&b[i].Y);
    for(int i=2;i<=n;i++)
    {
        double d=dist(a[i],a[i-1]);
        for(int j=1;j<=m;j++)
            if(2*d>=dist(a[i],b[j])+dist(a[i-1],b[j]))
                G[j].push_back(i);
    }    

    int res=0;
    for(int i=1;i<=m;i++,idx++) res+=dfs(i);
    printf("%d\n",res+n);
    for(int i=1;i<=n;i++)
    {
        if(mat[i]!=-1)
            printf("%d %d ",b[mat[i]].X,b[mat[i]].Y);
        printf("%d %d ",a[i].X,a[i].Y);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/newera/p/9348269.html

时间: 2024-10-10 10:02:44

[P2526][SHOI2001]小狗散步的相关文章

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

题意: Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点,不过会在给定的N个点和主人相遇.小狗和主人同时从(X1,Y1)点出发,并同时在(Xn,Yn)点汇合.小狗的速度最快是Grant的两倍.当主人从一个点以直线走向另一个点时,Pandog跑向一个它感兴趣的景点.Pandog每次与主人相遇之前最多只去一个景点. 分析: 我们可以把人每次走的一条路径当作点,显然狗只能从出发点走到符合条件的部分点,把这两个点连边,表示狗

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

传送门 简直就是模板题啊! #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #define N 101 using namespace std; int n, m, cnt; int X1[N], Y1[N], X2[N], Y2[N], head[N], to[N * N], nex[N * N], belong[N], ans[N]; bool vis[N

《小狗钱钱》读书笔记

钱钱语录:金钱有一些秘密和规律,要想了解这些秘密和规律,前提条件是,你自己必须真的有这个愿望. 钱钱语录:如果你只是带着试试看的心态,那么你最后只会以失败而告终,你会一事无成.尝试纯粹是一种借口,你还没有做,就已经给自己想好退路了.不能试验.你只有两个选择:做,或者不做. 钱钱语录:你是否能挣到钱,最关键的因素并不在于你是不是有一个好点子.你有多聪明也不是主要原因,决定因素是你的自信程度.一个人把精力集中在自己所能做的,知道的和拥有的东西上的那一天起,他的成功就已经拉开了序幕.这也使得一个孩子完

理财的童话-《小狗钱钱》

前言 理财能力本应该是每个人可以拥有的通用能力之一,然而大多数人毫不在意,我也是最近才开始关注这方面的能力. <小狗钱钱>是一本面向孩子的理财童话书,的确是适合给幼儿园的我们当作入门读物. 故事 一只叫钱钱(Money)的白色拉布拉多犬,教会了一个11岁的小女孩与钱打交道的方法.小女孩不仅掌握了钱的使用方法,而且帮她的父母走出了财务危机. 34条读书笔记 1 一开始,我们必须明确金钱对您的意义 富裕是我们与生俱来的权利,假如我们有充足的钱,我们就能生活的更有尊严,也能更好的为自己和他人服务.认

HTML5 Canvas 奔跑的小狗

效果如上图,共六个图像切换,形成小狗动态奔跑效果.完整代码和图片请从  https://files.cnblogs.com/files/xiandedanteng/runningDog.rar 下载. 代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&g

孙杨:真没女朋友,骗你是小狗

k7体育8月14日讯,孙杨在里约奥运会上收获一金一银的成绩,不过在这一届奥运会上,孙杨的奥运之旅显然没有伦敦奥运会上那么顺利. 第一天的400米自由泳中,孙杨以0.13秒只差不敌霍顿没能夺得金牌,虽然霍顿的人身攻击令人难受,但孙杨坦言赛后流泪并不是仅仅因为压力问题. “我原本希望用那一块金牌安慰奶奶的在天之灵.”孙杨说道. 孙杨在澳洲进行集训的时候,孙杨的奶奶去世了,为此孙杨希望用金牌告慰他的奶奶在天之灵. 在1500米的预赛前,孙杨因为感冒原因没能晋级决赛.曾有很多消息表示孙杨可能会退出比赛,

《小狗钱钱》《管道的故事》《富爸爸穷爸爸》读书笔记

序 三本书放在一起写读书笔记是因为三本书中的思想都是一脉相承的:不为钱而“钱”:介绍富人思维. 当我有了第一笔较可观的收入以后,我就开始更注意理财了,加之高昂的租房费用就迫使我不得不想办法弄出更多的钱来,只有提高净收入才不枉费我辛苦的工作. 不妨先摆出我理财的观点:我选择租距离公司近的房子,因为只有这样我才能节省下大量的时间来看书学习.24岁是人流体智力最巅峰的年纪,我要抓住这个机会从而加速丰富自己的头脑. <小狗钱钱> 不用重翻此书就能回想到的学习到的知识有: 尽量以最低的额度来偿还贷款,即

狗妈妈叼着“寻狗启事”牌找走失小狗

“我叫爱迪,我的‘女儿’两个半月大.6日5时许,它在哈达湾街与铁西路交会处附近的加油站旁走失了,我和主人着急上火,一宿没睡,哪位好心人看到了,请帮忙找找,主人必有酬谢!”网友爆料 狗妈妈早市叼牌找孩子 7日14时许,网友“吉林市秧歌队的”发帖称,通江街早市上,有一只狗妈妈坐在市场头,叼着一块牌子在找孩子呢,看着可可怜了.狗妈妈可懂事儿了,不时张望四周.可以看出眼圈略有眼泪流过的感觉.据狗的主人说,小狗6日失踪以后,大狼狗就不吃东西,一宿没睡. 主人讲述 遛狗回家路上 小狗走失 昨日,记者拨打了狗

HDU1010 Tempter of the Bone(小狗是否能逃生----DFS)

Tempter of the Bone Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggi