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相关推荐

  1. Rain on your Parade(二分图匹配-Hopcroft-Carp算法)

    (代码里有很多注释) 匈牙利算法的复杂度是O(n*e),那么如果对于一个点和边比较多的图,匈牙利算法很容易超时,采用Hopcroft-Carp算法能够在 O(sqrt(n)*e)的复杂度内实现二分图匹 ...

  2. HDU 2389 Rain on your Parade (二分图匹配)

    题意:天马上就要下雨了,然后有n个人,m把伞,然后分别给出人的坐标和他们跑的速度,以及伞的坐标,然后问在t时间内,最多能有多少人拿到伞. 题解:二分图匹配 之前做过一道类似的题目,是用最大流做的,但这 ...

  3. 二分图匹配 Hopcroft-Carp (HK) 算法详解 附例题

    了解这个算法之前 首先了解一个概念 :增广路 增广路 :简单的说 ,是二分图匹配中的一条边,他总是从 左边集合的一个点出发通过一条没有被匹配的边连接到右边集合,再从该点通过一条 匹配过的边连接到右边集 ...

  4. HDUOJ 2389 Rain on your Parade

    HDUOJ 2389 Rain on your Parade 题目链接 Problem Description You're giving a party in the garden of your ...

  5. HDU——hdu2389 Rain on your Parade

    hdu2389 Rain on your Parade 题解 1.构二分图. 2.匈牙利算法超时(O(VE)) 3.用Hopcroft-Carp算法(O(sqrt(V)E)) 算法讲解 算法模板 AC ...

  6. Dinic二分图匹配 || Luogu P3386

    题面:[模板]二分图匹配 思路:Dinic实现二分图匹配,要建一个超级源点(S)和超级汇点(T),分别定为N+M+1和N+M+2 然后S去和N中的数建正边和反边,正边权值为1,反边权值为0:M中的数去 ...

  7. 二分图匹配匈牙利算法DFS实现

    1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...

  8. poj1274(二分图匹配)

    (一道基础的二分图匹配) 题目意思大概为N个牛和M个栅栏,一个牛和一个栅栏只能匹配一次,求最大匹配 直接套用二分图最大匹配模板即可 #include <iostream> #include ...

  9. poj2724(二分图匹配)

    题目大概意思为有部分奶酪需要处理,若两个奶酪的二进制只有一位不同,则可以一起处理,问最少需要处理几次 题目思路: 将可以一起处理的两个奶酪用边连接在一起,相当于边只连接二进制中有偶数个1的奶酪和二进制 ...

最新文章

  1. LeetCode--004--寻找两个有序数组的中位数(java)
  2. ASP.NET WebAPi之断点续传下载(中)
  3. centos 安装vscode_CentOS6下安装VSCode
  4. 使用pip安装python库的几种方式,解决pip安装python库慢的问题
  5. IIR+全通滤波器实现相位平衡_matlab仿真
  6. 【数据结构与算法】之深入解析“最小栈”的求解思路与算法示例
  7. 【struts2】struts2工作流程
  8. 通过环境变量注入的方式启动SAP Spartacus B2B模块
  9. 龙芯linux内核,龙芯的linux kernel,内核开发与编译
  10. 颜宁:批评一下当年的「颜宁同学」
  11. TypeError: 'range' object doesn't support item deletion
  12. 架构中的设计原则之单一职责原则 - 《java开发技术-在架构中体验设计模式和算法之美》...
  13. React-Native 之 TabBarIOS
  14. Mate 30 不预装任何谷歌应用;阿里巴巴发布新“六脉神剑”;VS Code 1.38 发布 | 极客头条...
  15. POJ 3678 2-SAT简单题
  16. 【魔兽世界插件】魔兽世界插件实战笔记从入门到放弃的心理历程 第三节-窗体颜色设置与渐变
  17. ubuntu18安装ros1
  18. AcFun_API 之 分页读取番剧列表
  19. ai决策_人工智能时代的决策
  20. python做马尔科夫模型预测法_李航《统计学习方法》第十章——用Python实现隐马尔科夫模型...

热门文章

  1. 初中计算机实践研究计划,《初中信息技术学科学生作品有效评价的实践研究》课题研究计划...
  2. java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.c
  3. Linux 搭建NodeBB社区,搭建CAS登录认证平台,实现Nodebb接入企业CAS认证(一)
  4. 函数求最小公倍数-C语言
  5. 在 Linux 下用 CMAKE 编译安装 OpenCV 3.2.0
  6. halcon案例分享
  7. Android Studio Gradle实践之多渠道自动化打包+版本号管理
  8. 机器学习常见面试题总结
  9. pytorch 文档网页离线 HTML and PDF
  10. 小程序源码:宝宝起名神器微信小程序源码下载-多玩法安装简单