北工大2017校赛 1101:要打车的FanZzz
题目链接:
http://bjutacm.openjudge.cn/lianxi/1101/
思路:
二分 + 二分图最大匹配。
开始的时候我想直接用最小费用流模型,后来发现这样是错误的。因为这道题实际上是求一个匹配数>=n的匹配,并且满足在这个匹配中匹配边的最大的权值最小;而不是使所有匹配边的权值之和最小。这样看来就是一个典型的二分思路。首先对权值排序,每次选中原图中那些权值不能超过x的边,用这些边构建二分图。再用匈牙利算法check一下这个二分图的最大匹配数是否>=n。二分一下满足这样的条件下对应的最小的那个边权值x即可。
实现:
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std; const int MAXN = ;
int n, m;
double v, dis[MAXN + ][MAXN + ], edges[MAXN * MAXN + ];
vector<int> G[MAXN + ];
bool used[MAXN + ];
int match[MAXN + ]; struct point
{
int x, y;
};
point man[MAXN / + ], car[MAXN / + ]; bool dfs(int v)
{
used[v] = true;
for (int i = ; i < G[v].size(); i++)
{
int u = G[v][i];
int w = match[u];
if (w == - || !used[w] && dfs(w))
{
match[v] = u;
match[u] = v;
return true;
}
}
return false;
} int max_match()
{
int res = ;
for (int i = ; i <= n + m; i++)
{
if (match[i] == -)
{
memset(used, , sizeof(used));
if (dfs(i))
res++;
}
}
return res;
} bool check(double len)
{
for (int i = ; i <= n + m; i++)
match[i] = -;
memset(used, , sizeof(used));
for (int i = ; i <= n + m; i++)
G[i].clear();
for (int i = ; i < n; i++)
{
for (int j = ; j < m; j++)
{
if (dis[i][j] <= len)
{
G[i + ].push_back(j + n + );
G[j + n + ].push_back(i + );
}
}
}
return max_match() >= n;
} int square(int x)
{
return x * x;
} double cal_cost(int i, int j)
{
return sqrt(square(man[i].x - car[j].x) + square(man[i].y - car[j].y));
} int main()
{
while (cin >> n >> m)
{
for (int i = ; i < n; i++)
{
cin >> man[i].x >> man[i].y;
}
for (int i = ; i < m; i++)
{
cin >> car[i].x >> car[i].y;
}
cin >> v;
int cnt = ;
for (int i = ; i < n; i++)
{
for (int j = ; j < m; j++)
{
edges[cnt++] = dis[i][j] = cal_cost(i, j);
}
}
sort(edges, edges + cnt);
int l = , r = cnt - , res = cnt - ;
while (l <= r)
{
int mid = l + r >> ;
if (check(edges[mid]))
{
res = mid;
r = mid - ;
}
else
{
l = mid + ;
}
}
printf("%.2lf\n", edges[res] / v);
}
return ;
}
北工大2017校赛 1101:要打车的FanZzz的更多相关文章
- 2017校赛 问题 F: 懒人得多动脑
题目描述 小D的家A和学校B都恰好在以点F为焦点的双曲线上,而小D每日所需的生活水源在一条平行该双曲线准线的直线上,设它的值为v.大家都知道,每天都是要喝水的,但是小D有点懒,他希望自己能在去上学或者 ...
- 内工大acm校赛--整理代码
题目:小明搜到一行无缩进无换行代码,请帮小明整理代码.无for语句和case语句,而且只有一个主函数.你只要控制注意“:”“{”“}”这三个符号带来的缩进和换行效果就行. Input: 输入只有一行, ...
- 广工2017校赛-F-- tmk找三角
http://gdutcode.sinaapp.com/problem.php?cid=1056&pid=5 Description 有一棵树,树上有只tmk.他在这棵树上生活了很久,对他的构 ...
- 2017 校赛 问题 B: CZJ-Superman
题目描述 “那是只鸟?那是飞机?那是——超人!” 程序员在看完<CZJ-Superman>之后,励志要成为一名“CZJ-Superman”,学会了两个特殊技能ZZZ和JJJ,足以成为一名“ ...
- 2017校赛 问题 D: 我知道了,你知道了吗?【递归】
题目描述 Alice和Bob走在去学校的路上,听到两个路人的对话: 路人甲:我知道了, 你知道了吗? 路人乙:我知道你知道了,你知道了吗? 路人甲:我知道你知道我知道了,你知道了吗? 路人乙:我知道你 ...
- 2017 校赛 问题 E: 神奇的序列
题目描述 Aurora在南宁发现了一个神奇的序列,即对于该序列的任意相邻两数之和都不是三的倍数.现在给你一个长度为n的整数序列,让你判断是否能够通过重新排列序列里的数字使得该序列变成一个 ...
- 2017校赛 C: 不爱学习的小W【模拟】
题目描述 “叮铃铃”上课了,同学们都及时到了教室坐到了座位上,教室里有n行m列的座位而且刚好坐满.既然是上课,那老师叫学生回答问题就是再正常不过的事了,同样地,教室里也就有爱学习和不爱学习的学生了,爱 ...
- 2014哈商大ICPC/ACM校赛解题报告
被debug邀请去參加校赛,哎,被虐..我对不起工大.. 由于本人不搞ACM,算法处于HelloWorld水准.. 虽然题目除了鸟不拉屎星人之外都非常水,但我能做到这个程度,全然是超水平发挥了.. 数 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
随机推荐
- IE插件
在OA上要直接查看word等公告文件,就必须安装office控件.要安装office控件,需要在IE浏览器中做相应的设置.如何设置呢,下面由小编具体介绍下. 工具/原料 OA IE浏览器 方法/步 ...
- Serv-u 10.3 的图文安装教程及使用方法
现在很多windows服务器都是使用serv_u作为ftp服务器,一般情况下我们使用Serv-U FTP Server v6.4.0.6,这里以serv_u 10.3为例介绍下,方便需要的朋友 一 ...
- 微信小程序 wafer2框架摘要
微信小程序 wafer2框架摘要 帮助文档:https://github.com/tencentyun/wafer2-startup/wiki 使用了knex.js进行数据库交互,使用了koa.js进 ...
- 设计模式之外观模式(Facade)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- UML——用例图
用例图是在需求分析阶段开发人员和用户对需求规格达成的某种共识.它描写叙述了待开发系统的功能需求. UML视频使我们对用例图的基本组成元素.属性.粒度等有了理论上的理解,我们还须要自己亲自己主动手画一画 ...
- mac终端配置Android ADB命令
不得不说mac是一款开发利器,不仅可以开发ios,而且对于Android开发也是不错的选择,下面我就对mac配置adb命令,进行简要的说明.下面我将一下mac环境下的配置步骤:1.在自己的目录(hom ...
- install Django in mac
install Eclipse & Python(pydev) in mac install django in mac $ curl -O https://pypi.python.org/p ...
- 关于appcompat_v7的说明
http://blog.csdn.net/crazykbc/article/details/21553699 问题描述: 使用eclipse创建一个Android项目时,发现project列表中会多创 ...
- mystr = '{}{}{}'.format(mystr, random.randint(0, 9), adurl)
mystr = '{}{}{}'.format(mystr, random.randint(0, 9), adurl)
- SSDP 抓包
简单服务发现协议(SSDP,Simple Service Discovery Protocol)