二分匹配的模板题,这里用网络流模板(见刘汝佳《算法竞赛入门经典·训练指南》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. tomcat服务器端口冲突问题的解决

    问题:tomcat服务器端口冲突 原因:服务器端口被占用:重启服务器之前原来的服务器没有关闭. 解决方案: 方案一:把占用的端口结束(方便快捷) 在cmd窗口输入命令 netstat -ano (查看 ...

  2. sqlserver 游标写法

    1.简单游标 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 declare m_cursor cursor scroll for select  Address,People ...

  3. Spring学习(12)--- @Autowired与@Resource 对比

    Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解,如:@Resource. @PostConstruct及@PreDestroy. 1. @Autowi ...

  4. vue初学实践之路——vue简单日历组件(1)

    ---恢复内容开始--- 最近做的项目有一个需求,需要有一个日历组件供预定功能使用,之前的代码过于繁琐复杂,所以我采用vue重写了这个组件. npm.vue等等安装. 只是一个简单的日历组件,所以并不 ...

  5. Java基础——关于访问权限的一道例题

    一.回顾访问修饰符 ==public:被它修饰的类,属性,方法,不仅可以跨类访问,而且可以跨包(package)访问 ==private:可以修饰数据成员,构造方法,方法,不能修饰类,被它修饰的成员只 ...

  6. H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持

    H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持 1,H.264格式 网络表示层NAL,如图H.264流由一帧一帧的NALU组成: SPS:序列参数集,作用于一系列连续的编码 ...

  7. 《javascript高级程序设计》笔记三

    第三章 基本概念 任何语言的核心必然会描述这门语言最基本的工作原理.这部分内容对我们来说,读起来很乏味,甚至会产生困意,但这部分内容却是重要的!我有幸拜读<JavaScript高级程序设计> ...

  8. 如何简单的实现新手引导之UGUI篇

    一个完整的游戏项目肯定是要做新手引导的,而引导做的好坏可能会影响玩家的留存.那么怎么简单的实现个简有效的引导呢!先不说废话,先看看效果,这是一个基于UGUI做的一个简单的引导! 怎么样,看着是那么回事 ...

  9. Http批量异步发送和数据保存

    先说需求. 有个服务程序定时扫描指定文件夹下一个所有文件,文件包含了多个用户(客户)信息及对应的http发送地址和发送数据.现在该服务程序需要提取这些用户信息,然后批量进行发送:发送完后需要将http ...

  10. SVN仓库迁移到Git遇到的两个问题和解决办法

    OS: CentOS 7.0 准备: git svn git-svn sudo yum install git sudo yum install subversion sudo yum install ...