周大爷在比赛中搜到的黑科技二分图模版,复杂度为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. Centos6.5中如何用sqlite3命令打开’.db’后缀的数据库执行sql

      1. 简单sql语句使用: 在任意目录下新建一个数据库,比如student . 命令: sqlite3 student.db 出现如下提示: 输入sql语句create table user(us ...

  2. 关于Spring配置文件提示的插件下载

    1.springsource-tool-suite-update 最新各个版本下载地址 第一种方式: springsource-tool-suite-3.7.3.RELEASE-e4.5.2-upda ...

  3. jQuery.validate.js表单验证插件

    jQuery.validate.js表单验证插件的使用 效果: 代码: <!DOCTYPE html> <html lang="en"> <head& ...

  4. PHP的strtotime()函数2038年bug问题

    最近在开发一个订单查询模块的时候,想当然的写了个2099年的日期,结果PHP返回了空值,肯定是发生溢出错误了,搜索了网上,发现下面这篇文章,但是我的问题依然没有解决,要怎么得到2038年以后的时间戳呢 ...

  5. [Doctrine Migrations] 数据库迁移组件的深入解析四:集成diff方式迁移组件

    场景及优势 熟悉Symfony框架之后,深刻感受到框架集成的ORM组件Doctrine2的强大之处,其中附带的数据迁移也十分方便.Doctrine2是使用Doctrine DBAL组件把代码里面的表结 ...

  6. 大数据 : Hadoop reduce阶段

    Mapreduce中由于sort的存在,MapTask和ReduceTask直接是工作流的架构.而不是数据流的架构.在MapTask尚未结束,其输出结果尚未排序及合并前,ReduceTask是又有数据 ...

  7. Shellz中awk的简单用法

    其实shell脚本的功能常常被低估.在实际应用中awk sed 等用法可以为shell提供更为强大的功能.下面我们将一下awk调用的简单方法进行了总结.方便同学们学习: awk的简单用法: 第一种调用 ...

  8. linux不重启挂载磁盘安装grub

    挂载.分区.grub 通过给一块新磁盘安装grub回顾磁盘挂载.分区文件系统创建等操作: 该实验基于(CtonOS6.8:kernel:2.6.32-642.15.1.el6.x86_64) 1.通过 ...

  9. Python爬虫系列 - 初探:爬取旅游评论

    Python爬虫目前是基于requests包,下面是该包的文档,查一些资料还是比较方便. http://docs.python-requests.org/en/master/ POST发送内容格式 爬 ...

  10. web前端知识点1

    1. input属于窗体元素,层级显示比flash.其它元素都高.请判断这句话的正确与否. 错误 层级显示优先级: frameset > 表单元素 > 非表单元素 在html中,帧元素(f ...