链接:

https://vjudge.net/problem/HDU-2389

题意:

You’re giving a party in the garden of your villa by the sea. The party is a huge success, and everyone is here. It’s a warm, sunny evening, and a soothing wind sends fresh, salty air from the sea. The evening is progressing just as you had imagined. It could 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.

思路:

二分图最大匹配,匈牙利算法超时。改用hopcroft-karp算法。

吧能在时间内跑到的伞加到人的配对上,hopcroft-karp算法还不是太懂。

代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include <memory.h>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
using namespace std;
const int MAXN = 3e3+10;
const int INF = 1<<30; struct Node
{
double x, y;
};
Node P[MAXN], U[MAXN];
vector<int> G[MAXN];
double Speed[MAXN];
int Link_l[MAXN], Vis[MAXN];
int Link_r[MAXN];
int Dis_x[MAXN], Dis_y[MAXN];
int n, m;
int dis; double GetLen(Node a, Node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} bool Search()
{
memset(Dis_x, -1, sizeof(Dis_x));
memset(Dis_y, -1, sizeof(Dis_y));
dis = INF;
queue<int> que;
for (int i = 1;i <= m;i++)
{
if (Link_r[i] == -1)
que.emplace(i);
Dis_x[i] = 0;
}
while (!que.empty())
{
int u = que.front();
que.pop();
if (Dis_x[u] > dis)
break;
for (int i = 0;i < G[u].size();i++)
{
int node = G[u][i];
if (Dis_y[node] == -1)
{
Dis_y[node] = Dis_x[u]+1;
if (Link_l[node] == -1)
dis = Dis_y[node];
else
{
Dis_x[Link_l[node]] = Dis_y[node]+1;
que.push(Link_l[node]);
}
}
}
}
return dis != INF;
} bool Dfs(int x)
{
for (int i = 0;i < G[x].size();i++)
{
int node = G[x][i];
if (Vis[node] || Dis_y[node] != Dis_x[x]+1)
continue;
Vis[node] = 1;
if (Link_l[node] != -1 && Dis_y[node] == dis)
continue;
if (Link_l[node] == -1 || Dfs(Link_l[node]))
{
Link_l[node] = x;
Link_r[x] = node;
return true;
}
}
return false;
} int Solve()
{
memset(Link_l, -1, sizeof(Link_l));
memset(Link_r, -1, sizeof(Link_r));
int cnt = 0;
while (Search())
{
memset(Vis, 0, sizeof(Vis));
for (int i = 1;i <= m;i++)
{
if (Link_r[i] == -1 && Dfs(i))
cnt++;
}
}
return cnt;
} int main()
{
int t, cnt = 0;
scanf("%d", &t);
while (t--)
{
int time;
scanf("%d", &time);
scanf("%d", &m);
for (int i = 1;i <= m;i++)
G[i].clear();
for (int i = 1;i <= m;i++)
scanf("%lf%lf%lf", &P[i].x, &P[i].y, &Speed[i]);
scanf("%d", &n);
for (int i = 1;i <= n;i++)
scanf("%lf%lf", &U[i].x, &U[i].y);
for (int i = 1;i <= m;i++)
{
for (int j = 1;j <= n;j++)
{
double len = GetLen(P[i], U[j]);
if (len/Speed[i] <= time)
G[i].push_back(j);
}
}
int sum = Solve();
printf("Scenario #%d:\n%d\n\n", ++cnt, sum);
} return 0;
}

HDU-2389-Rain on your Parade (最大匹配,kopcroft-karp)的更多相关文章

  1. HDU 2389 Rain on your Parade 最大匹配(模板题)【HK算法】

    <题目链接> 题目大意:有m个宾客,n把雨伞,预计时间t后将会下大雨,告诉你每个宾客的位置和速度,每把雨伞的位置,问你最多几个宾客能够拿到伞. 解题分析: 本题就是要我们求人与伞之间的最大 ...

  2. 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 ...

  3. 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 ...

  4. HDU 2389 Rain on your Parade(二分匹配,Hopcroft-Carp算法)

    Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Ot ...

  5. HDU 2389 Rain on your Parade

    大意:在一个二维坐标系上有nx个人和ny把伞,每个人都有自己的移动速度,问有多少人可以再 time 时间内移动到不同的雨伞处(不允许两个人共用一把伞).   输入数据: 第一行是一个T代表T组测试数据 ...

  6. Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)

    题目链接: Hdu 3289 Rain on your Parade 题目描述: 有n个客人,m把雨伞,在t秒之后将会下雨,给出每个客人的坐标和每秒行走的距离,以及雨伞的位置,问t秒后最多有几个客人可 ...

  7. HDOJ 2389 Rain on your Parade

     HK.... Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K ...

  8. 【HDOJ】2389 Rain on your Parade

    读题显然是二分图匹配,看成guest与umbrella的匹配.匈牙利果断TLE了,其实时间卡的相当紧.HK过的,750ms. /* 2389 */ #include <iostream> ...

  9. HDU2389 Rain on your Parade —— 二分图最大匹配 HK算法

    题目链接:https://vjudge.net/problem/HDU-2389 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)  ...

  10. Hdu2389 Rain on your Parade (HK二分图最大匹配)

    Rain on your Parade Problem Description You’re giving a party in the garden of your villa by the sea ...

随机推荐

  1. Java学习之==>JDBC

    一.概述 官方解释: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的 Java API,可以为多种关系型数据库提供统一访问,它由一组用 ...

  2. Python学习之==>Socket网络编程

    一.计算机网络 多台独立的计算机通过网络通信设备连接起来的网络.实现资源共享和数据传递.在同一台电脑上可以将D盘上的一个文件传到C盘,但如果想从一台电脑传一个文件到另外一台电脑上就要通过计算机网络 二 ...

  3. python--008文件处理

    一.文件操作 1.打开文件,获得文件句柄,并将句柄赋值给一个变量 2.通过句柄对文件操作 3.关闭文件 f=open('sg',encoding='utf-8') da=f.read() print( ...

  4. jitamin配置(nginx设置)

    server { listen 66; server_name 192.168.2.253; root "/var/www/jitamin/public"; location / ...

  5. Linux下面误删除文件使用extundelete工具恢复介绍

    操作系统版本:CentOS release 6.4 (Final)      软件版本:extundelete-0.2.4.tar.bz2 PS:该软件恢复文件系统仅支持ext2/ext3/ext4 ...

  6. 修改python pip3镜像源

    方法一: pip3 install 包名  -i 镜像源url 主要的镜像源: pip3 install tornado -i https://pypi.douban.com/simple/  pip ...

  7. Excel透视表进阶之计算字段、计算项、切片器、页面布局

    计算字段 在透视表的字段列表中通过函数.公式等方式构建一个新的字段 又称虚拟字段,因为计算字段不会出现在数据源中,对于普通字段的操作,都可以对计算字段进行操作 计算字段只能出现在值区域,不能出现在筛选 ...

  8. Java最新学习线路(基础,源码,项目,实战)

    如需获取以下学习资源请关注公众号:Java编程指南 我们为自学者编程的或初学java的小伙伴们准备了一整套完整的学习资源和文章,还有我自己在自学路上的一些总结和学习线路,希望能帮到小伙伴们,如果有什么 ...

  9. Forsaken喜欢数论

    链接:https://ac.nowcoder.com/acm/contest/1221/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言1048 ...

  10. Head First PHP&MySQl第四章代码

    addemail.php <!DOCTYPE html> <html lang="cn" dir="ltr"> <head> ...