xdu_1048:二分匹配模板测试
二分匹配的模板题,这里用网络流模板(见刘汝佳《算法竞赛入门经典·训练指南》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:二分匹配模板测试的更多相关文章
- dfs,bfs的二分匹配模板(模板题hdu1150)
		
如果不懂匈牙利算法,请点击:该趣味算法http://blog.csdn.net/dark_scope/article/details/8880547 模板: //DFS版本下的二分匹配算法 http: ...
 - Courses HDU - 1083 (二分匹配模板题)
		
Consider a group of N students and P courses. Each student visits zero, one or more than one courses ...
 - 四川第七届 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), ...
 - hdu 1150 Machine Schedule (经典二分匹配)
		
//A组n人 B组m人 //最多有多少人匹配 每人仅仅有匹配一次 # include<stdio.h> # include<string.h> # include<alg ...
 - zoj 2362 Beloved Sons【二分匹配】
		
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2361 来源:http://acm.hust.edu.cn/vjudg ...
 - [kuangbin带你飞]专题十一 网络流
		
ID Origin Title 34 / 81 Problem A POJ 3436 ACM Computer Factory 92 / 195 Problem B POJ 3 ...
 - 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 ...
 - Marriage is Stable
		
Marriage is Stable Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
 - Uncle Tom's Inherited Land*
		
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
 
随机推荐
- (转)C++——std::string类的引用计数
			
1.概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里 ...
 - CommonsChunkPlugin并不是分离第三方库的好办法(DllPlugin科学利用浏览器缓存)
			
webpack算是个磨人的小妖精了.之前一直站在glup阵营,使用browserify打包,发现webpack已经火到爆炸,深怕被社区遗落,赶紧拿起来把玩一下.本来只想玩一下的.尝试打包了以后,就想启 ...
 - Function.prototyoe.call.apply
			
刚刚在一个群里看到有人问 Function.prototype.call.apply(obj, args) 如何理解,觉得挺有意思的.刚开始被惯性思维干扰了,一直都是 call 和 apply 分开用 ...
 - 编写高质量代码改善程序的157个建议:使用Dynamic来简化反射的实现
			
最近有时间看点书了,把157个建议在重新看一遍,代码都调试一遍.当我看到第15个建议的时候有些出入,就记录下来,欢迎大家来探讨. 第十五条建议是,使用dynamic简化反射的使用,没有说明具体的条件. ...
 - 跨域CORS
			
一.跨域CORS是什么 当一个资源从与该资源本身所在的服务器的域或端口不同的域或不同的端口请求一个资源时,浏览器会发起一个跨域 HTTP 请求.出于安全考虑,浏览器会限制从脚本内发起的跨域HTTP请求 ...
 - Feign使用Hystrix无效原因及解决方法
			
最近项目重构使用了Spring Boot和Spring Cloud.这两者结合确实给项目带来了方便,同时也遇到了一些问题.其中使用feign作为服务消费,但是断路器hystrix一直不起作用让人很费解 ...
 - python+NLTK 自然语言学习处理:环境搭建
			
首先在http://nltk.org/install.html去下载相关的程序.需要用到的有python,numpy,pandas, matplotlib. 当安装好所有的程序之后运行nltk.dow ...
 - java 多线程访问同一个对象数据保护的问题
			
java 多线程同时访问统一个数据的时候,会引起一些错误,后面的线程会修改数据,而前面的线程还在使用修改前的内容, 使用 synchronized 关键字,保证代码块只能有一个线程来访问 public ...
 - Linux: Bash基本命令
			
切换目录 cd 查看当前目录 pwd 生成目录 mkdir 搜索文件 查看当前的文件 ls 删除文件但保留特定类型 rm !(**) 例如: rm !(.tex|*.eps)其中,.tex, .eps ...
 - CSharpGL(42)借助帧缓存实现渲染到纹理(RenderToTexture)
			
CSharpGL(42)借助帧缓存实现渲染到纹理(RenderToTexture) 渲染到纹理(Render To Texture)是实现很多OpenGL高级效果的一个基础.本文记录了如何用CShar ...