二分图匹配模板
Posted qseer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分图匹配模板相关的知识,希望对你有一定的参考价值。
题目描述
给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数
输入输出格式
输入格式:
第一行,n,m,e
第二至e+1行,每行两个正整数u,v,表示u,v有一条连边
输出格式:
共一行,二分图最大匹配
输入输出样例
说明
n,m≤1000,1≤u≤n,1≤v≤m
因为数据有坑,可能会遇到 v>mv>m 的情况。请把 v>mv>m 的数据自觉过滤掉。
std
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ans,mp[1001][1001],match[10001]; bool vis[10001]; int p,n,m; bool Hungary(int x){ for(int i=1;i<=m;++i){ if(!vis[i] && mp[x][i]){ vis[i]=true; if(!match[i] || Hungary(match[i])){ match[i]=x; return 1; } } } return 0; } int main() { scanf("%d%d%d",&n,&m,&p); for(int i=1;i<=p;++i) { int from,to; scanf("%d%d",&from,&to); if(from>=1&&from<=n && to>=1&&to<=p) mp[from][to]=1; } for(int i=1;i<=n;++i) { memset(vis,false,sizeof(vis)); ans+=Hungary(i); } printf("%d",ans); return 0; }
以上是关于二分图匹配模板的主要内容,如果未能解决你的问题,请参考以下文章