二分匹配的模板题,这里用网络流模板(见刘汝佳《算法竞赛入门经典·训练指南》P359 Dinic算法)做。

将男女生均看做网络上的节点,题中给出的每个“关系”看做一条起点为u节点,终点为v结点,容量为1的弧(因为每对“关系”只有匹配成功与失败两种情况,用1为容量即可表示)。再取超级源汇s,t,由s向每个男生结点引容量为1的弧,每个女生结点向t引容量为1的弧(每个男生或是女生最多只能匹配成功一次,容量这样设置的话,一个结点与一个异性结点匹配成功后,它与所点的源点或汇点的流量将为1,无空余容量了,也就无法再继续同第三者匹配)。最后跑最大流算法就好了。

题目链接

 #include<bits/stdc++.h>
 using namespace std;

 const int INF = 0x3f3f3f3f;//即int的最大值

 struct Edge
 {
     int from,to,cap,flow;
 };

 int n,s,t,m,A,B;    // A B为本题特有
                     // s t为超级源汇
 , M = ;

 struct Dinic
 {
     vector<int> G[N];
     bool vis[N];
     int d[N];
     int cur[N];
     vector<Edge> edges;
     void init()
     {
         ; i<n+; i++) //注意这里的 结点下标 的范围
             G[i].clear();
         edges.clear();
     }
     void AddEdge(int from,int to,int cap)
     {
         edges.push_back((Edge){});
         edges.push_back((Edge){to,,});
         int w=edges.size();
         G[);
         G[to].push_back(w-);
     }
     bool bfs()
     {
         memset(vis,,sizeof(vis));
         queue<int>Q;
         d[s] = ;
         Q.push(s);
         vis[s]=;
         while (!Q.empty())
         {
             int x = Q.front();
             Q.pop();
             ; i<G[x].size(); i++)
             {
                 Edge e=edges[G[x][i]];
                 if (!vis[e.to]&&e.cap>e.flow)
                 {
                     vis[e.to]=;
                     d[e.to] = d[x] + ;
                     Q.push(e.to);
                 }
             }
         }
         return vis[t];
     }
     int dfs(int x, int a)
     {
         ) return a;
         ,f;
         for (int&i = cur[x] ; i<G[x].size(); i++)
         {
             Edge& e=edges[G[x][i]];
             &&(f=dfs(e.to,min(a,e.cap-e.flow)))>)
             {
                 e.flow+=f;
                 edges[G[x][i]^].flow-=f;    //流量增大意味着净容量减少
                 flow+=f;                    //反向边容量表示了正向边的流量
                 a -= f;
                 )break;
             }
         }
         return flow;
     }
     int Maxflow(int s, int t)
     {
         ;
         while (bfs())
         {
             memset(cur,,sizeof(cur));
             flow += dfs(s, INF);
         }
 //        for(int i=1; i<=n; i++)
 //            for(int j=0; j<G[i].size(); j++)
 //                printf("from:%d to:%d cap:%d flow:%d\n",i,edges[G[i][j]].to,edges[G[i][j]].cap,edges[G[i][j]].flow);
         return flow;
     }
 } g;

 int main()
 {
     while(~scanf("%d%d",&A,&B))
     {
         n=A+B;
         g.init();
         s=n,t=n+;
         int l;
         scanf("%d",&l);
         while(l--)
         {
             int a,b;
             scanf("%d%d",&a,&b);
             g.AddEdge(a,b+A,);
         }
         ; i<A; i++)
             g.AddEdge(s,i,);
         ; i<B; i++)
             g.AddEdge(i+A,t,);
         printf("%d\n",g.Maxflow(s,t));
     }
 }

xdu_1048:二分匹配模板测试的更多相关文章

  1. dfs,bfs的二分匹配模板(模板题hdu1150)

    如果不懂匈牙利算法,请点击:该趣味算法http://blog.csdn.net/dark_scope/article/details/8880547 模板: //DFS版本下的二分匹配算法 http: ...

  2. Courses HDU - 1083 (二分匹配模板题)

    Consider a group of N students and P courses. Each student visits zero, one or more than one courses ...

  3. 四川第七届 D Vertex Cover(二分图最小点覆盖,二分匹配模板)

    Vertex Cover frog has a graph with nn vertices v(1),v(2),…,v(n)v(1),v(2),…,v(n) and mm edges (v(a1), ...

  4. hdu 1150 Machine Schedule (经典二分匹配)

    //A组n人 B组m人 //最多有多少人匹配 每人仅仅有匹配一次 # include<stdio.h> # include<string.h> # include<alg ...

  5. zoj 2362 Beloved Sons【二分匹配】

    题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2361 来源:http://acm.hust.edu.cn/vjudg ...

  6. [kuangbin带你飞]专题十一 网络流

            ID Origin Title   34 / 81 Problem A POJ 3436 ACM Computer Factory   92 / 195 Problem B POJ 3 ...

  7. Codeforces Round #277.5 (Div. 2)B——BerSU Ball

    B. BerSU Ball time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. Marriage is Stable

    Marriage is Stable Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

  9. Uncle Tom's Inherited Land*

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...

随机推荐

  1. PHP文件操作,多行句子的读取,file()函数,file_get_contents()函数,file_put_contents()函数,is_file,统计网站pv (访问量),文件的复制 copy,文件重命名 rename,删除文件 unlink

    php中添加utf-8: header("Content-type:text/html;charset='UTF-8'"); 文件操作步骤: 1.在同一目录下建立一个file.tx ...

  2. 【Python中if __name__ == '__main__': 的解析】

    在很多Python代码中,在代码的最下方会看到  if __name__ == '__main__':,这段代码到底有什么用呢? 在理解这个语句的作用前,需要知道的是,一般的Python文件后缀为.p ...

  3. servlet与jsp

    Servlet生命周期 一.初始化阶段   当WEB客户第一次请求访问某个Servlet的时候,WEB容器将创建这个Servlet的实例.调用init()方法进行Servlet的初始化 一.响应客户请 ...

  4. Compare and Swap [CAS] 算法

    一个Java 5中最好的补充是对原子操作的支持类,如AtomicInteger,AtomicLong等.这些类帮助你减少复杂的(不必要的)多线程代码,实际上只是完成一些基本操作,如增加或减少多个线程之 ...

  5. Bash内置命令exec和重定向

    Bash内置命令exec可以替换当前程序而不需要启动一个新的进程,可以改变标准输入和输出而不需要启动一个新的子进程.如果文件用exec打开,read命令就会把文件指针每次指向下一行直到文件的末尾,如果 ...

  6. CoreLocation 框架

    获取设备的地理位置和方向 一.概述 CoreLocation框架,它提供了如下几种服务 确定设备的地理位置 高度 方向 或到附近 iBeacon 的相对位置. 这个框架使用所有可用的车载硬件.如 Wi ...

  7. Webpack 3 中的新特性

    本文简短地分享下最新发布的 Webpack 3 中的新特性,供大家参考. 1. Webpack 3 的新特性 6 月 20 日,Webpack 发布了最新的 3.0 版本,并在 Medium 发布了公 ...

  8. 转化来的图标用法symbol引用‘font-class引用及Unicode引用

  9. ReactiveCocoa源码解析(三) Signal代码的基本实现

    上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...

  10. Spring两种代理区别

    Spring的两种代理JDK和CGLIB的区别浅谈: Java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用invokeHandler类来处理: 而cglib动态代理是利用a ...