(Hopcroft-Carp二分图匹配)Rain on your Parade
http://acm.hdu.edu.cn/showproblem.php?pid=2389
经典求最大匹配题,数据范围过大,匈牙利算法超时
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
/* ******************************** 二分图匹配(Hopcroft-Carp算法)* 复杂度O(sqrt(n)*E)* 邻接表存图,vector实现* vector先初始化,然后假如边* uN 为左端的顶点数,使用前赋值(点编号0开始)*/
const int MAXN = 3030;
const int INF = 0x3f3f3f3f;
vector<int>G[MAXN];
int uN;int Mx[MAXN],My[MAXN];
int dx[MAXN],dy[MAXN];
int dis;
bool used[MAXN];
bool SearchP()
{queue<int>Q;dis = INF;memset(dx,-1,sizeof(dx));memset(dy,-1,sizeof(dy));for(int i = 0 ; i < uN; i++)if(Mx[i] == -1){Q.push(i);dx[i] = 0;}while(!Q.empty()){int u = Q.front();Q.pop();if(dx[u] > dis)break;int sz = G[u].size();for(int i = 0;i < sz;i++){int v = G[u][i];if(dy[v] == -1){dy[v] = dx[u] + 1;if(My[v] == -1)dis = dy[v];else{dx[My[v]] = dy[v] + 1;Q.push(My[v]);}}}}return dis != INF;
}
bool DFS(int u)
{int sz = G[u].size();for(int i = 0;i < sz;i++){int v = G[u][i];if(!used[v] && dy[v] == dx[u] + 1){used[v] = true;if(My[v] != -1 && dy[v] == dis)continue;if(My[v] == -1 || DFS(My[v])){My[v] = u;Mx[u] = v;return true;}}}return false;
}
int MaxMatch()
{int res = 0;memset(Mx,-1,sizeof(Mx));memset(My,-1,sizeof(My));while(SearchP()){memset(used,false,sizeof(used));for(int i = 0;i < uN;i++)if(Mx[i] == -1 && DFS(i))res++;}return res;
}struct Point
{int x,y,s;void input1(){scanf("%d%d%d",&x,&y,&s);}void input2(){scanf("%d%d",&x,&y);}
};
int dis2(Point a,Point b)
{return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
Point p1[MAXN],p2[MAXN];int main()
{int T;int t;int iCase = 0;int n,m;scanf("%d",&T);while(T--){iCase++;scanf("%d",&t);scanf("%d",&n);for(int i = 0;i < n;i++)p1[i].input1();scanf("%d",&m);for(int i = 0;i < m;i++)p2[i].input2();for(int i = 0;i < n;i++)G[i].clear();uN = n;for(int i = 0;i < n;i++)for(int j = 0;j < m;j++)if(dis2(p1[i],p2[j]) <= p1[i].s*p1[i].s*t*t)G[i].push_back(j);printf("Scenario #%d:\n",iCase);printf("%d\n\n",MaxMatch());}return 0;
}
(Hopcroft-Carp二分图匹配)Rain on your Parade相关推荐
- Rain on your Parade(二分图匹配-Hopcroft-Carp算法)
(代码里有很多注释) 匈牙利算法的复杂度是O(n*e),那么如果对于一个点和边比较多的图,匈牙利算法很容易超时,采用Hopcroft-Carp算法能够在 O(sqrt(n)*e)的复杂度内实现二分图匹 ...
- HDU 2389 Rain on your Parade (二分图匹配)
题意:天马上就要下雨了,然后有n个人,m把伞,然后分别给出人的坐标和他们跑的速度,以及伞的坐标,然后问在t时间内,最多能有多少人拿到伞. 题解:二分图匹配 之前做过一道类似的题目,是用最大流做的,但这 ...
- 二分图匹配 Hopcroft-Carp (HK) 算法详解 附例题
了解这个算法之前 首先了解一个概念 :增广路 增广路 :简单的说 ,是二分图匹配中的一条边,他总是从 左边集合的一个点出发通过一条没有被匹配的边连接到右边集合,再从该点通过一条 匹配过的边连接到右边集 ...
- HDUOJ 2389 Rain on your Parade
HDUOJ 2389 Rain on your Parade 题目链接 Problem Description You're giving a party in the garden of your ...
- HDU——hdu2389 Rain on your Parade
hdu2389 Rain on your Parade 题解 1.构二分图. 2.匈牙利算法超时(O(VE)) 3.用Hopcroft-Carp算法(O(sqrt(V)E)) 算法讲解 算法模板 AC ...
- Dinic二分图匹配 || Luogu P3386
题面:[模板]二分图匹配 思路:Dinic实现二分图匹配,要建一个超级源点(S)和超级汇点(T),分别定为N+M+1和N+M+2 然后S去和N中的数建正边和反边,正边权值为1,反边权值为0:M中的数去 ...
- 二分图匹配匈牙利算法DFS实现
1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...
- poj1274(二分图匹配)
(一道基础的二分图匹配) 题目意思大概为N个牛和M个栅栏,一个牛和一个栅栏只能匹配一次,求最大匹配 直接套用二分图最大匹配模板即可 #include <iostream> #include ...
- poj2724(二分图匹配)
题目大概意思为有部分奶酪需要处理,若两个奶酪的二进制只有一位不同,则可以一起处理,问最少需要处理几次 题目思路: 将可以一起处理的两个奶酪用边连接在一起,相当于边只连接二进制中有偶数个1的奶酪和二进制 ...
最新文章
- ActionBar通过Tab进行不同的Fragment之间的交换
- CommandBehavior.CloseConnection有何作用
- Spring Boot 配置文件中的花样,看这一篇足矣!
- django的ajax_get请求
- CSS 字体(font)实例
- vivado 启动过程中报错
- 机器字长 存储字长 指令字长 机器字长
- android GPS
- GD32VF103启动流程分析
- 【转】中华吸血鬼分析
- 华为员工:表面光鲜 工作十年买不起房
- 三维匹配_多视图几何三维重建实战系列之COLMAP
- 利用R语言进行主成分分析的步骤
- IDEA Error occurred during initialization of VM
- 高红梅:第三章 第二节 身份焦虑与英雄梦
- openstack环境搭建之六horizon配置
- 【七】【vlc-android】vlc的decoder控制层传输数据与ffmpeg音频解码模块decoder层进行解码的数据交互流程源码分析
- 底层嵌入式之NOR FLASH编程
- 《黑镜》(Black Mirror)
- 341-Linux 连接数据库