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 ...
随机推荐
- 用Python玩微信(非常详细)
代码放在这里:wzyonggege/python-wechat-itchat 词云那里可以换成小黄人图片 ----------------------------------------------- ...
- python语言精粹《一》
第一章 静态语言:需要声明类型.变量不能改变类型! 动态语言:(也称脚本语言)主要的应用场景都是很短的应用程序(脚本),比如给静态语言编写的程序进行数据预处理.这样的程序通常也统称胶水代码. pyth ...
- nodejs - 守护进程 supervisor
1. 安装 npm -g install supervisor 2. 如果使用了expres框架 需要修改启动方式 到 package.json中的 "scripts&quo ...
- C++构造函数(二)
本篇是介绍C++的构造函数的第二篇(共二篇),属于读书笔记,对C++进行一个系统的复习. 复制构造函数 复制构造函数是构造函数的一种,也被称为拷贝构造函数,他只有一个参数,参数类型是本类的引用.默认构 ...
- linux exec操作文件描述符
linux每一个打开文件都会关联一个文件描述符,需要的时候我们可以使用exec命令指定一个大于3的数字作为文件 linux默认文件描述符 每打开一个shell就会打开默认的三个文件描述符描0,1,2, ...
- ReactiveSwift源码解析(一) Event与Observer代码实现
ReactiveCocoa这个框架是做什么用的本篇博客就不做过多赘述了,什么是"响应式编程"也不多聊了,自行Google吧.本篇博客的主题是解析ReactiveCocoa框架中的核 ...
- Cordova各个插件使用介绍系列(六)—$cordovaDevice获取设备的相关信息
详情请看:Cordova各个插件使用介绍系列(六)—$cordovaDevice获取设备的相关信息 在项目中需要获取到当前设备,例如手机的ID,联网状态,等,然后这个Cordova里有这个插件可以用, ...
- 【转载】Windows系统下删除ubuntu
原始日期:2013-11-02 15:51 以windows7为例: 用MbrFix.exe修复MBR 卸载Windows/Linux双系统中的Ubuntu1.如果你有Windows系统安装盘/启 ...
- crontab问题处理
用pyhton写了一些爬虫,由于数据量比较大,需要跑的时间也比较长,所以将代码部署到服务器上.选择用crontab完成爬虫的定时爬取数据,这样避免了人工的干预,减少一些人为错误.但在部署crontab ...
- Linux编程之有限状态机FSM的理解与实现
有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.FSM是一种逻辑单元内部的一种高效编程方法,在 ...