(匹配 Hopcroft-Karp算法)Rain on your Parade -- Hdu --2389
链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2389
不能用匈牙利,会TEL的,用Hopcroft-Karp
以前是寻找一个增广路,这个是寻找所有的增广路,并且使用BFS进行分层
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std; #define N 3100
#define INF 0xfffffff struct node
{
int x, y, s;
} x[N], y[N]; struct Node
{
int v, next;
} a[N*N]; int head[N], cnt, n, m;
bool used[N];
int Mx[N], My[N], depth; ///记录的所匹配的端点,0表示未匹配
int dx[N], dy[N]; ///BFS分层时,记录点所在的层,-1表示不在分层 void Init()
{
cnt = ;
memset(head, -, sizeof(head));
} void Add(int u, int v)
{
a[cnt].v = v;
a[cnt].next = head[u];
head[u] = cnt++;
} bool BFS()///如果发现y这边有增广路,返回1,否则返回0
{
queue<int> Q; depth = INF; memset(dx, -, sizeof(dx));
memset(dy, -, sizeof(dy)); for(int i=; i<=n; i++)
{
if( Mx[i] == false )
{
dx[i] = ;
Q.push(i);
}
} while(Q.size())
{
int u = Q.front(); Q.pop();
if(dx[u] > depth) break;///已经找到了增广路,不必寻找下层 for(int j=head[u]; j!=-; j=a[j].next)
{
int v = a[j].v; if( dy[v] == - )
{
dy[v] = dx[u] + ; if(My[v] == false)
depth = dy[v];
else
{
dx[ My[v] ] = dy[v] + ;
Q.push( My[v] );
}
}
}
} if( depth == INF )
return false;
return true;
}
bool Find(int i)
{
for(int j=head[i]; j!=-; j=a[j].next)
{
int v = a[j].v; if( !used[v] && dx[i] == dy[v]-)
{
used[v] = true; if( My[v] && dy[v] == depth )
continue;///不会在下一层,因为还没有对下层进行增广 if( !My[v] || Find( My[v] ) )
{
My[v] = i;
Mx[i] = v;
return true;
}
}
} return false;
} int Karp()
{
int ans = ;
memset(Mx, false, sizeof(Mx));
memset(My, false, sizeof(My)); while( BFS() == true )
{///如果还存在增广路
memset(used, false, sizeof(used));
for(int i=; i<=n; i++)
{
if( !Mx[i] && Find(i) == true )
ans++;
}
} return ans;
} int main()
{
int t, iCase=; scanf("%d", &t);
while(t--)
{
int time, i, j; scanf("%d%d", &time, &n);
Init();
for(i=; i<=n; i++)
{
scanf("%d%d%d", &x[i].x, &x[i].y, &x[i].s);
x[i].s = x[i].s*x[i].s*time*time;
} scanf("%d", &m);
for(i=; i<=m; i++)
{
scanf("%d%d", &y[i].x, &y[i].y);
for(j=; j<=n; j++)
{
int d = (y[i].x-x[j].x)*(y[i].x-x[j].x) + (y[i].y-x[j].y)*(y[i].y-x[j].y);
if( d <= x[j].s )
Add(j, i);
}
} int ans = Karp(); printf("Scenario #%d:\n%d\n\n", iCase++, ans);
}
return ;
}
(匹配 Hopcroft-Karp算法)Rain on your Parade -- Hdu --2389的更多相关文章
- F - Rain on your Parade - hdu 2389(二分图匹配,Hk算法)
题意:给一些人和一些伞的坐标,然后每个人都有一定的速度,还有多少时间就会下雨,问最多能有多少人可以拿到伞. 分析:题意很明确,可以用每个人和伞判断一下是否能够达到,如果能就建立一个联系.不过这道题的数 ...
- Rain on your Parade HDU - 2389 (hc板题)
在客人能够拿到的伞与客人之间建边 跑hc就好了.... 看看别人的:https://blog.csdn.net/wall_f/article/details/8248350 #include < ...
- hdu2389二分图之Hopcroft Karp算法
You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...
- 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 ...
- 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 ...
- Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)
题目链接: Hdu 3289 Rain on your Parade 题目描述: 有n个客人,m把雨伞,在t秒之后将会下雨,给出每个客人的坐标和每秒行走的距离,以及雨伞的位置,问t秒后最多有几个客人可 ...
- 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) ...
- Rain on your Parade
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...
随机推荐
- apache-tomcat-7.0.8\bin\tcnative-1.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform
问题: apache-tomcat-7.0.8\bin\tcnative-1.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform 解决:jd ...
- js的拼接
var datatr = " <tr>"; datatr += "<td bgcolor='#EEEEEE'><input class='i ...
- 卸载 visual studio 2012时先把系统还原打开
否则,会停留在创建还原点那儿很长时间 .
- 02 - Unit05:加载笔记列表
加载笔记列表 发送Ajax请求 绑定发送事件 获取参数: bookId 发送请求: /note/list.do 事件绑定 $(function(){ Ajax请求发送-->服务器处理--> ...
- 在laravel之外使用eloquent
视频地址 https://laracasts.com/lessons/how-to-use-eloquent-outside-of-laravel
- C# 播放器, 收藏
C#写了一个调用libvlc api实现的万能视频播放器 http://www.cnblogs.com/haibindev/archive/2011/12/21/2296173.html 引用库 ht ...
- Data_Structure03-栈和队列
一.学习总结 1.写出你认为本周学习中比较重要的知识点关键词 ·抽象数据类型 ·栈和队列 2.思维导图 二.PTA实验作业 选题: 1.7-1 jmu-字符串是否对称(20 分) 2.7-4(选做) ...
- 五、jdk工具之jmap(java memory map)、 mat之四--结合mat对内存泄露的分析、jhat之二--结合jmap生成的dump结果在浏览器上展示
目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...
- Bootstrap-Plugin:弹出框(Popover)插件
ylbtech-Bootstrap-Plugin:弹出框(Popover)插件 1.返回顶部 1. Bootstrap 弹出框(Popover)插件 弹出框(Popover)与工具提示(Tooltip ...
- pyinstaller的使用方法 by 王大龙
---------------------------------------------------------------------------------------------------- ...