题目背景

二分图

题目描述

给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数

输入输出格式

输入格式:

第一行,n,m,e

第二至e+1行,每行两个正整数u,v,表示u,v有一条连边

输出格式:

共一行,二分图最大匹配

输入输出样例

输入样例#1: 复制

1 1 1
1 1
输出样例#1: 复制

1

说明

n,m \leq 1000n,m≤1000, 1 \leq u \leq n1≤u≤n, 1 \leq v \leq m1≤v≤m

因为数据有坑,可能会遇到 v>mv>m 的情况。请把 v>mv>m 的数据自觉过滤掉。

算法:二分图匹配

建一个超级源点S

建一个超级汇点T

连n条S到1-n的边

连m条n+1-n+1+m到T的边

所有边的权值都是1

跑最大流

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int MAXN=*1e6;
const int INF=0x7ffff;
inline int read()
{
char c=getchar();int flag=,x=;
while(c<''||c>'') {if(c=='-') flag=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-,c=getchar();return x*flag;
}
struct node
{
int u,v,f,nxt;
}edge[MAXN];
int head[MAXN];
int num=;
inline void add_edge(int x,int y,int z)
{
edge[num].u=x;
edge[num].v=y;
edge[num].f=z;
edge[num].nxt=head[x];
head[x]=num++;
}
int n,m,e;
int S,T;
int deep[MAXN],cur[MAXN];
inline bool BFS()
{
memset(deep,,sizeof(deep));
deep[S]=;
queue<int>q;
q.push(S);
while(q.size()!=)
{
int p=q.front();q.pop();
for(int i=head[p];i!=-;i=edge[i].nxt)
if(deep[edge[i].v]==&&edge[i].f)
deep[edge[i].v]=deep[p]+,q.push(edge[i].v);
}
return deep[T];
}
int DFS(int now,int nowflow)
{
if(nowflow<=||now==T) return nowflow;
int totflow=;
for(int &i=cur[now];i!=-;i=edge[i].nxt)
{
if(deep[edge[i].v]==deep[now]+&&edge[i].f)
{
int canflow=DFS(edge[i].v,min(edge[i].f,nowflow));
totflow+=canflow;
nowflow-=canflow;
edge[i].f-=canflow;
edge[i^].f+=canflow;
if(nowflow<=) break;
}
}
return totflow;
}
int ans=;
inline void Dinic()
{
while(BFS())
{
memcpy(cur,head,sizeof(head));
ans+=DFS(S,INF);
} }
int main()
{
memset(head,-,sizeof(head));
n=read();m=read();e=read();
for(int i=;i<=e;i++)
{
int x=read(),y=read();
add_edge(x,y+n,);
add_edge(y+n,x,);
}
S=,T=INF;
for(int i=;i<=n;i++)
add_edge(S,i,),add_edge(i,S,);
for(int i=;i<=m;i++)
add_edge(i+n,T,),add_edge(T,i+n,);
Dinic();
printf("%d",ans);
return ;
}

最新文章

  1. java练习题(字符串类):显示4位验证码、输出年月日、从XML中抓取信息
  2. 文件快速搜索工具-Everything的使用(转)
  3. 【gradle】之maven主库找不到Could not find org.restlet.jee:org.restlet:2.1.1
  4. C++中定义比较函数的三种方法
  5. Android 布局优化 -- 学习笔记
  6. IOS中TableView的使用(1) -创建一个简单的tableView
  7. android 4.2 源码在64位Ubuntu编译
  8. 一起学 Java(四) File、Try 、序列化、MySQL、Socket
  9. liunx文件与用户和群组
  10. [LeetCode] Soup Servings 供应汤
  11. open-falcon实现邮件报警
  12. 【转】解决configure: error: C++ compiler cannot create executables问题
  13. OFbiz--简单介绍
  14. 探寻main函数的“标准”写法,以及获取main函数的参数、返回值
  15. Linux及Windows系统配置JDK环境变量
  16. C# Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005
  17. c++ 判断两个容器是否相等(equal)
  18. [转]go中的main函数和init函数
  19. mybatis加入条件
  20. BZOJ3772 精神污染 【主席树 + dfs序】

热门文章

  1. Java Web乱码分析及解决方式(二)——POST请求乱码
  2. 在启动php时,无法启动此程序,由于计算机中丢失MSVCR110.dll的解决方法
  3. CSS 相对/绝对(relative/absolute)定位与jQuery的控制显示隐藏
  4. php中局部变量和全局变量
  5. 关于checkbox的一些jquery操作
  6. export和source的区别
  7. win10下虚拟机安装XP系统 后无网卡的解决
  8. USB摄像头驱动框架分析(五)
  9. 今日SGU 5.13
  10. CentOS下部署巡风步骤详解