HDU2389(KB10-F 二分图最大匹配Hopcroft_Karp)
Rain on your Parade
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Others)
Total Submission(s): 4728 Accepted Submission(s): 1552
Problem Description
But nothing ever is perfect. One of your guests works in weather forecasting. He suddenly yells, “I know that breeze! It means its going to rain heavily in just a few minutes!” Your guests all wear their best dresses and really would not like to get wet, hence they stand terrified when hearing the bad news.
You have prepared a few umbrellas which can protect a few of your guests. The umbrellas are small, and since your guests are all slightly snobbish, no guest will share an umbrella with other guests. The umbrellas are spread across your (gigantic) garden, just like your guests. To complicate matters even more, some of your guests can’t run as fast as the others.
Can you help your guests so that as many as possible find an umbrella before it starts to pour?
Given the positions and speeds of all your guests, the positions of the umbrellas, and the time until it starts to rain, find out how many of your guests can at most reach an umbrella. Two guests do not want to share an umbrella, however.
Input
Each test case starts with a line containing the time t in minutes until it will start to rain (1 <=t <= 5). The next line contains the number of guests m (1 <= m <= 3000), followed by m lines containing x- and y-coordinates as well as the speed si in units per minute (1 <= si <= 3000) of the guest as integers, separated by spaces. After the guests, a single line contains n (1 <= n <= 3000), the number of umbrellas, followed by n lines containing the integer coordinates of each umbrella, separated by a space.
The absolute value of all coordinates is less than 10000.
Output
Sample Input
1
2
1 0 3
3 0 3
2
4 0
6 0
1
2
1 1 2
3 3 2
2
2 2
4 4
Sample Output
2
Scenario #2:
2
Source
- //2017-08-26
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- #include <queue>
- using namespace std;
- const int N = ;
- const int M = ;
- const int INF = 0x3f3f3f3f;
- int head[N], tot;
- struct Edge{
- int to, next;
- }edge[M];
- void add_edge(int u, int v){
- edge[tot].to = v;
- edge[tot].next = head[u];
- head[u] = tot++;
- }
- //xlink[i]表示左集合顶点i匹配的右集合的点,ylink[i]表示右集合顶点i匹配的左集合的点
- int xlink[N], ylink[N];
- //xlevel[i]表示左集合顶点i的所在层数,ylevel[i]表示右集合顶点i的所在层数
- int xlevel[N], ylevel[N];
- bool vis[N];
- struct Hopcroft_Karp{
- int dis, xn, yn;//xn表示左集合顶点个数,yn表示右集合顶点个数
- void init(int _xn, int _yn){
- tot = ;
- xn = _xn;
- yn = _yn;
- memset(head, -, sizeof(head));
- memset(xlink, -, sizeof(xlink));
- memset(ylink, -, sizeof(ylink));
- }
- bool bfs(){
- queue<int> que;
- dis = INF;
- memset(xlevel, -, sizeof(xlevel));
- memset(ylevel, -, sizeof(ylevel));
- for(int i = ; i < xn; i++)
- if(xlink[i] == -){
- que.push(i);
- xlevel[i] = ;
- }
- while(!que.empty()){
- int u = que.front();
- que.pop();
- if(xlevel[u] > dis)break;
- for(int i = head[u]; i != -; i = edge[i].next){
- int v = edge[i].to;
- if(ylevel[v] == -){
- ylevel[v] = xlevel[u] + ;
- if(ylink[v] == -)
- dis = ylevel[v];
- else{
- xlevel[ylink[v]] = ylevel[v]+;
- que.push(ylink[v]);
- }
- }
- }
- }
- return dis != INF;
- }
- int dfs(int u){
- for(int i = head[u]; i != -; i = edge[i].next){
- int v = edge[i].to;
- if(!vis[v] && ylevel[v] == xlevel[u]+){
- vis[v] = ;
- if(ylink[v] != - && ylevel[v] == dis)
- continue;
- if(ylink[v] == - || dfs(ylink[v])){
- xlink[u] = v;
- ylink[v] = u;
- return ;
- }
- }
- }
- return ;
- }
- //二分图最大匹配
- //input:建好的二分图
- //output:ans 最大匹配数
- int max_match(){
- int ans = ;
- while(bfs()){
- memset(vis, , sizeof(vis));
- for(int i = ; i < xn; i++)
- if(xlink[i] == -)
- ans += dfs(i);
- }
- return ans;
- }
- }hk_match;
- int n, m, pour_time;
- struct Guests{
- int x, y, speed;
- }guests[N];
- struct Umbrella{
- int x, y;
- }umbrella[N];
- bool getUmbrella(int i, int j){
- return (guests[i].x-umbrella[j].x)*(guests[i].x-umbrella[j].x)
- + (guests[i].y-umbrella[j].y)*(guests[i].y-umbrella[j].y)
- <= guests[i].speed*guests[i].speed*pour_time*pour_time;
- }
- int main()
- {
- std::ios::sync_with_stdio(false);
- //freopen("inputF.txt", "r", stdin);
- int T, kase = ;
- cin>>T;
- while(T--){
- cin>>pour_time>>m;
- for(int i = ; i < m; i++)
- cin>>guests[i].x>>guests[i].y>>guests[i].speed;
- cin>>n;
- for(int i = ; i < n; i++)
- cin>>umbrella[i].x>>umbrella[i].y;
- hk_match.init(m, n);
- for(int i = ; i < m; i++)
- for(int j = ; j < n; j++)
- if(getUmbrella(i, j))
- add_edge(i, j);
- cout<<"Scenario #"<<++kase<<":"<<endl<<hk_match.max_match()<<endl<<endl;
- }
- return ;
- }
HDU2389(KB10-F 二分图最大匹配Hopcroft_Karp)的更多相关文章
- HDU2389 Rain on your Parade —— 二分图最大匹配 HK算法
题目链接:https://vjudge.net/problem/HDU-2389 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) ...
- [HDU] 2063 过山车(二分图最大匹配)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2063 女生为X集合,男生为Y集合,求二分图最大匹配数即可. #include<cstdio> ...
- [POJ] 1274 The Perfect Stall(二分图最大匹配)
题目地址:http://poj.org/problem?id=1274 把每个奶牛ci向它喜欢的畜栏vi连边建图.那么求最大安排数就变成求二分图最大匹配数. #include<cstdio> ...
- 二分图最大匹配:匈牙利算法的python实现
二分图匹配是很常见的算法问题,一般用匈牙利算法解决二分图最大匹配问题,但是目前网上绝大多数都是C/C++实现版本,没有python版本,于是就用python实现了一下深度优先的匈牙利算法,本文使用的是 ...
- bzoj 1854: [Scoi2010]游戏 (并查集||二分图最大匹配)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1854 写法1: 二分图最大匹配 思路: 将武器的属性对武器编号建边,因为只有10000种 ...
- 二分图最大匹配|UOJ#78|匈牙利算法|边表|Elena
#78. 二分图最大匹配 从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,…,nl1,…,nl 和 1,…,nr1,…,nr. 有若干个这样的条件:第 vv 个男生 ...
- HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- 【二分】【字符串哈希】【二分图最大匹配】【最大流】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem I. Minimum Prefix
给你n个字符串,问你最小的长度的前缀,使得每个字符串任意循环滑动之后,这些前缀都两两不同. 二分答案mid之后,将每个字符串长度为mid的循环子串都哈希出来,相当于对每个字符串,找一个与其他字符串所选 ...
- 【bzoj2044】三维导弹拦截 dp+二分图最大匹配
题目描述 n个物品,第i个位置有ai.bi.ci三种属性.每次可以选出满足$\ a_{p_i}<a_{p_{i+1}}\ ,\ b_{p_i}<b_{p_{i+1}}\ ,\ c_{p_i ...
随机推荐
- solr 5.5使用 和pyg里 的4.10.3版 部署到tomcat中不一样(不使用内置jetty)
http://www.cnblogs.com/zhuxiaojie/p/5764680.html
- PICE(3):CassandraStreaming - gRPC-CQL Service
在上一篇博文里我们介绍了通过gRPC实现JDBC数据库的streaming,这篇我们介绍关于cassandra的streaming实现方式.如果我们需要从一个未部署cassandra的节点或终端上读取 ...
- 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)
组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...
- karma 启动提示PhantomJS not found on PATH
Karma 介绍:是由AngularJS团队开发的测试执行过程管理实用工具,帮助开发人员在不同的浏览器中执行测试. 一般搭配PhantomJS作为浏览器启动器.PhantomJS是一个非主流的Webk ...
- [原创]K8飞刀20160613 Plesk密码 & 注册表16进制转换 & Html实体解密
K8飞刀 by K8拉登哥哥@[K8搞基大队]博客: http://qqhack8.blog.163.com 简介: K8飞刀是一款多功能的安全测试工具. Hacker Swiss Army Kni ...
- Ruby:线程实现经典的生产者消费者问题
运行结果: ProAndCon 0 produced 1 produced consumed 0 2 produced 3 produced consumed 1 consumed 2 consume ...
- 微信web开发者工具、破解文件、开发文档和开发Demo下载
关注,QQ群,微信应用号社区 511389428 下载: Win: https://pan.baidu.com/s/1bHJGEa Mac: https://pan.baidu.com/s/1slhD ...
- IdentityServer-Setup and Overview
设置和概述 有两种方式创建一个IdentityServer 项目: 从零开始 使用Visual Studio的ASP.NET Identity模板 如果是从零开始,我们提供一序列的帮助及内存存储,所以 ...
- discuz 数据库文件密码修改
网站系统需要修改的位置有两处 Discuz 和 UC-center ①路径:/wwwroot/config/config_global.php 这个根据你网站安装的路径而定. 打开 config_gl ...
- JavaScript中该如何[更好的]做动效
在用js写动画的时候,无非使用 setTimeout/setInterval 或者 requestAnimationFrame 来处理动画(在jquery的代码里也是这么干的),本文主要为了记录下两者 ...