周大爷在比赛中搜到的黑科技二分图模版,复杂度为m√(n):

注意:点的序号要从0开始!

需要把nx,ny都赋值为n(点数)

  1. const int MAXN = ;
  2. const int MAXM = *;
  3.  
  4. struct Edge {
  5. int v;
  6. int next;
  7. } edge[MAXM];
  8.  
  9. struct node {
  10. double x, y;
  11. double v;
  12. } a[MAXN], b[MAXN];
  13.  
  14. int nx, ny;
  15. int cnt;
  16. int t;
  17. int dis;
  18.  
  19. int first[MAXN];
  20. int xlink[MAXN], ylink[MAXN];
  21. /*xlink[i]表示左集合顶点所匹配的右集合顶点序号,ylink[i]表示右集合i顶点匹配到的左集合顶点序号。*/
  22. int dx[MAXN], dy[MAXN];
  23. /*dx[i]表示左集合i顶点的距离编号,dy[i]表示右集合i顶点的距离编号*/
  24. int vis[MAXN]; //寻找增广路的标记数组
  25.  
  26. void init() {
  27. cnt = ;
  28. memset(first, -, sizeof(first));
  29. memset(xlink, -, sizeof(xlink));
  30. memset(ylink, -, sizeof(ylink));
  31. }
  32.  
  33. void read_graph(int u, int v) {
  34. edge[cnt].v = v;
  35. edge[cnt].next = first[u], first[u] = cnt++;
  36. }
  37.  
  38. int bfs() {
  39. queue<int> q;
  40. dis = INF;
  41. memset(dx, -, sizeof(dx));
  42. memset(dy, -, sizeof(dy));
  43. for(int i = ; i < nx; i++) {
  44. if(xlink[i] == -) {
  45. q.push(i);
  46. dx[i] = ;
  47. }
  48. }
  49. while(!q.empty()) {
  50. int u = q.front();
  51. q.pop();
  52. if(dx[u] > dis) break;
  53. for(int e = first[u]; e != -; e = edge[e].next) {
  54. int v = edge[e].v;
  55. if(dy[v] == -) {
  56. dy[v] = dx[u] + ;
  57. if(ylink[v] == -) dis = dy[v];
  58. else {
  59. dx[ylink[v]] = dy[v]+;
  60. q.push(ylink[v]);
  61. }
  62. }
  63. }
  64. }
  65. return dis != INF;
  66. }
  67.  
  68. int find(int u) {
  69. for(int e = first[u]; e != -; e = edge[e].next) {
  70. int v = edge[e].v;
  71. if(!vis[v] && dy[v] == dx[u]+) {
  72. vis[v] = ;
  73. if(ylink[v] != - && dy[v] == dis) continue;
  74. if(ylink[v] == - || find(ylink[v])) {
  75. xlink[u] = v, ylink[v] = u;
  76. return ;
  77. }
  78. }
  79. }
  80. return ;
  81. }
  82.  
  83. int MaxMatch() {
  84. int ans = ;
  85. while(bfs()) {
  86. memset(vis, , sizeof(vis));
  87. for(int i = ; i < nx; i++) if(xlink[i] == -) {
  88. ans += find(i);
  89. }
  90. }
  91. return ans;
  92. }
  93.  
  94. double dist(const node a, const node b) {
  95. return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
  96. }

调用:

  1. init();
  2. for(int i = ; i < m; i++) {
  3. if(l[edgee[i][]] && edgee[i][] != s && !l[edgee[i][]]) read_graph(edgee[i][],edgee[i][]);
  4. if(l[edgee[i][]] && edgee[i][] != s && !l[edgee[i][]]) read_graph(edgee[i][],edgee[i][]);
  5. }
  6. nx = n;
  7. ny = n;
  8. int ans = MaxMatch();

二分图最大匹配模版 m√(n) 复杂度的更多相关文章

  1. HDU-1083 Courses 二分图 最大匹配

    题目链接:https://cn.vjudge.net/problem/HDU-1083 题意 有一些学生,有一些课程 给出哪些学生可以学哪些课程,每个学生可以选多课,但只能做一个课程的代表 问所有课能 ...

  2. UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法

    二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). ...

  3. 【网络流#6】POJ 3041 Asteroids 二分图最大匹配 - 《挑战程序设计竞赛》例题

    学习网络流中ing...作为初学者练习是不可少的~~~构图方法因为书上很详细了,所以就简单说一说 把光束作为图的顶点,小行星当做连接顶点的边,建图,由于 最小顶点覆盖 等于 二分图最大匹配 ,因此求二 ...

  4. SPOJ 4206 Fast Maximum Matching (二分图最大匹配 Hopcroft-Carp 算法 模板)

    题目大意: 有n1头公牛和n2头母牛,给出公母之间的m对配对关系,求最大匹配数.数据范围:  1 <= n1, n2 <= 50000, m <= 150000 算法讨论: 第一反应 ...

  5. HDU2389(KB10-F 二分图最大匹配Hopcroft_Karp)

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

  6. HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...

  7. POJ 1469 COURSES 二分图最大匹配 二分图

    http://poj.org/problem?id=1469 这道题我绝壁写过但是以前没有mark过二分图最大匹配的代码mark一下. 匈牙利 O(mn) #include<cstdio> ...

  8. UVA1663 Purifying Machine (匈牙利算法,二分图最大匹配)

    模版集合个数减少是因为匹配串集合中没被匹配过的一对串匹配了.所以就是找一个二分图最大匹配. 因为集合X和Y是不好分开的,但是可以直接跑,两个集合都会跑一遍,所以一个匹配会被算两次,返回的时候除以2就行 ...

  9. 二分图最大匹配初探 By cellur925

    一.什么是二分图 首先它需要是一张无向图. 之后它需要同时满足两个条件:①它的N个点被分为两个集合,且这两个集合交集为空:②同一集合内的点之间没有边相连. 二.无向图是否为二分图的判定 引理:无向图是 ...

随机推荐

  1. e2fsprogs

    开源文件系统ext2/ext3/ext4管理工具e2progs包含的工具组件: 1.debugfs: ext2/ext3/ext4文件系统调试工具.debugfs是一个交互式的文件系统调试工具,可以用 ...

  2. Mvc+Hui+SqlSugar+Autofac+NLog+T4 架构设计(一)

    一.前言 作为小菜鸟第一次写博客的我还有点小激动,最近开始打算着手写一个属于自己架构.算下来差不多最近花一周多的下班时间了来写这个框架,本来想整体架构开发完成测试完成后才写博客,怕自己没时间或失去动力 ...

  3. Java中的IO流(六)

    上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...

  4. 聊聊编程开发的数据库批量插入(sql)

    这里的批量插入,主要是支持SQL的大型存储数据库,本文以Mysql,Oracle,SqlServer,postgresql4类来说明,这大概是国内应用比较多的了.其余的应该可以按照这些去找.提到编程的 ...

  5. redefinition of class解决

    垃圾玩意我在这儿翻车了. 编译器:Code::Block(懒得用VS,而且又太大了,CB小,而且也就一个控制台程序) Note to myself: 写完一个class的文件定义,编译,通过之后: 1 ...

  6. #leetcode刷题之路21-合并两个有序链表

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例:输入:1->2->4, 1->3->4输出:1->1->2-&g ...

  7. javascript编写的一个完整全方位轮播图效果

    1 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...

  8. HTML5 添加视频和音频(响应式视频)

    最初的 HTML5规范呼吁所有浏览器内置支持使用 Ogg格式① 直接播放视频或音频(无需插件).但是由于 HTML5工作组的内部争议,曾经作为基线标准的支持 Ogg(包括 Theoravideo 和 ...

  9. mongodb学习一(使用mongoResposity)

    最近公司做一个项目用到了mongodb,下面来介绍一下MongoRepository接口. 大家可以类比Hibernate的jpa,MongoRepository是一个springdata提供的一个有 ...

  10. 百度云虚拟主机BCH安装PHP框架CodeIgniter

    百度云虚拟主机BCH官方未支持CodeIgniter框架,本人参加php中文网活动获取一百度云虚拟主机,本人选的ThinkPHP版,但本人喜欢CodeIgniter框架,因此尝试在该主机上配置Code ...