Hdu2389 Rain on your Parade (HK二分图最大匹配)
Rain on your Parade
be the perfect end of a beautiful day.
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.
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.
case with a blank line.
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
2
Scenario #2:
2
——————————————————————————————————
题目的意思是给出那个人的位置和速度,m把伞的位置,问t秒内最多少人拿到伞
思路:拿人和伞进行二分图匹配,数据较大匈牙利炸,用Hopcroft-Karp方法
- #include <iostream>
- #include <cstdio>
- #include <string>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- #include <queue>
- #include <vector>
- #include <set>
- #include <stack>
- #include <map>
- #include <climits>
- using namespace std;
- const int MAXN = 3010;//左边节点数量、右边节点数量
- const int MAXM = 3010*3010;//边的数量
- const int INF = 0x7FFFFFFF;
- struct Edge
- {
- int v;
- int next;
- } edge[MAXM];
- int nx, ny;
- int cnt;
- int dis;
- int first[MAXN];
- int xlink[MAXN], ylink[MAXN];
- /*xlink[i]表示左集合顶点所匹配的右集合顶点序号,ylink[i]表示右集合i顶点匹配到的左集合顶点序号。*/
- int dx[MAXN], dy[MAXN];
- /*dx[i]表示左集合i顶点的距离编号,dy[i]表示右集合i顶点的距离编号*/
- int vis[MAXN]; //寻找增广路的标记数组
- struct point
- {
- int x,y,v;
- } a[MAXN],b[MAXN];
- void init()
- {
- cnt = 0;
- memset(first, -1, sizeof(first));
- memset(xlink, -1, sizeof(xlink));
- memset(ylink, -1, sizeof(ylink));
- }
- void read_graph(int u, int v)
- {
- edge[cnt].v = v;
- edge[cnt].next = first[u], first[u] = cnt++;
- }
- int bfs()
- {
- queue<int> q;
- dis = INF;
- memset(dx, -1, sizeof(dx));
- memset(dy, -1, sizeof(dy));
- for(int i = 0; i < nx; i++)
- {
- if(xlink[i] == -1)
- {
- q.push(i);
- dx[i] = 0;
- }
- }
- while(!q.empty())
- {
- int u = q.front();
- q.pop();
- if(dx[u] > dis) break;
- for(int e = first[u]; e != -1; e = edge[e].next)
- {
- int v = edge[e].v;
- if(dy[v] == -1)
- {
- dy[v] = dx[u] + 1;
- if(ylink[v] == -1) dis = dy[v];
- else
- {
- dx[ylink[v]] = dy[v]+1;
- q.push(ylink[v]);
- }
- }
- }
- }
- return dis != INF;
- }
- int find(int u)
- {
- for(int e = first[u]; e != -1; e = edge[e].next)
- {
- int v = edge[e].v;
- if(!vis[v] && dy[v] == dx[u]+1)
- {
- vis[v] = 1;
- if(ylink[v] != -1 && dy[v] == dis) continue;
- if(ylink[v] == -1 || find(ylink[v]))
- {
- xlink[u] = v, ylink[v] = u;
- return 1;
- }
- }
- }
- return 0;
- }
- int MaxMatch()
- {
- int ans = 0;
- while(bfs())
- {
- memset(vis, 0, sizeof(vis));
- for(int i = 0; i < nx; i++) if(xlink[i] == -1)
- {
- ans += find(i);
- }
- }
- return ans;
- }
- int main()
- {
- int T,t;
- int q=1;
- scanf("%d",&T);
- while(T--)
- {
- init();
- scanf("%d",&t);
- scanf("%d",&nx);
- for(int i=0; i<nx; i++)
- {
- scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v);
- }
- scanf("%d",&ny);
- for(int i=0; i<ny; i++)
- {
- scanf("%d%d",&b[i].x,&b[i].y);
- }
- for(int i=0; i<nx; i++)
- for(int j=0; j<ny; j++)
- {
- if((a[i].x-b[j].x)*(a[i].x-b[j].x)+(a[i].y-b[j].y)*(a[i].y-b[j].y)<=t*a[i].v*t*a[i].v)
- read_graph(i,j);
- }
- int ans = MaxMatch();
- printf("Scenario #%d:\n%d\n\n",q++,ans);
- }
- return 0;
- }
Hdu2389 Rain on your Parade (HK二分图最大匹配)的更多相关文章
- HDU2389:Rain on your Parade(二分图最大匹配+HK算法)
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...
- HDU2389 Rain on your Parade —— 二分图最大匹配 HK算法
题目链接:https://vjudge.net/problem/HDU-2389 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) ...
- HDU 2389 Rain on your Parade / HUST 1164 4 Rain on your Parade(二分图的最大匹配)
HDU 2389 Rain on your Parade / HUST 1164 4 Rain on your Parade(二分图的最大匹配) Description You're giving a ...
- hdu-2389.rain on your parade(二分匹配HK算法)
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...
- hdu2389 Rain on your Parade 二分图匹配--HK算法
You’re giving a party in the garden of your villa by the sea. The party is a huge success, and every ...
- HDU2389(KB10-F 二分图最大匹配Hopcroft_Karp)
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...
- HDU 2389 ——Rain on your Parade——————【Hopcroft-Karp求最大匹配、sqrt(n)*e复杂度】
Rain on your Parade Time Limit:3000MS Memory Limit:165535KB 64bit IO Format:%I64d & %I64 ...
- Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)
题目链接: Hdu 3289 Rain on your Parade 题目描述: 有n个客人,m把雨伞,在t秒之后将会下雨,给出每个客人的坐标和每秒行走的距离,以及雨伞的位置,问t秒后最多有几个客人可 ...
- Rain on your Parade
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...
随机推荐
- Linux_(2)基本命令(下)
六.文件搜索命令11 :which功能描述:显示系统命令所在目录命令所在路径:/usr/bin/which执行权限:所有用户语法:which [命令名称]范例:$ which ls 12 :find功 ...
- 扩展、委托、Lambda、linq
1.扩展 扩展是一个很有用的功能.如果你有一个类.不能修改,同时你又想给他加一个方法.这个过程就是扩展.扩展就是扩展方法. 例1: 类People public class People { publ ...
- Vue 全家桶介绍
Vue有著名的全家桶系列,包含了vue-router(http://router.vuejs.org),vuex(http://vuex.vuejs.org), vue-resource(https: ...
- python轻量级orm
python下的orm使用SQLAlchemy比较多,用了一段时间感觉不顺手,主要问题是SQLAlchemy太重,所以自己写了一个orm,实现方式和netsharp类似,oql部分因为代码比较多,没有 ...
- 堆和索引堆的实现(python)
''' 索引堆 ''' ''' 实现使用2个辅助数组来做.有点像dat.用哈希表来做修改不行,只是能找到这个索引,而需要change操作 还是需要自己手动写.所以只能用双数组实现. #引入索引堆的核心 ...
- Python : locals and globals
Python有两个内置的函数,locals() 和globals(),它们提供了基于字典的访问局部和全局变量的方式.Python使用叫做名字空间的东西来记录变量的轨迹.名字空间只是一个 字典,它的键字 ...
- js之function
function* function* 这种声明方式(function关键字后跟一个星号)会定义一个生成器函数 (generator function),它返回一个 Generator 对象. 你 ...
- windows 2003端口80system进程占用的情况
1.首先是http服务 a. 位置 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTPb. 把 REG_DWORD 类型的项 Start ...
- 2017/2/10springMVC中文乱码问题
springMVC中文乱码问题 一:从jsp传到后台控制出现的乱码有以下两个方面: 1.当提交方式为get的时候(因为字符拦截器无法拦截get): 修改方法为: 再改工程里的tomcat的配置文件se ...
- 【算法】Escape
The students of the HEU are maneuvering for their military training. The red army and the blue army ...