题目背景
二分图
题目描述
给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数
输入输出格式
输入格式:
第一行,n,m,e
第二至e+1行,每行两个正整数u,v,表示u,v有一条连边
输出格式:
共一行,二分图最大匹配
输入输出样例
说明
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 的数据自觉过滤掉。
算法:二分图匹配
显然,是个板子题,现在才知道考场上自己yy的二分图多么恶心+丑陋
#include<cstdio> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int maxn = 10086; vector<int>vec[10086]; int n,m,e,used[maxn],link[maxn]; bool find(int x,int f) { for(int i=0;i<vec[x].size();++i) { int v=vec[x][i]; if(used[v]!=f) {//此操作可省略memset vis 判断本轮有没有搜索 used[v]=f; if(link[v]==-1||find(link[v],f)) { link[v]=x;return true; } } } return 0; } int main() { int ans=0; scanf("%d%d%d",&n,&m,&e); memset(link,-1,sizeof(link)); for(int i=1,a,b;i<=e;++i) { scanf("%d%d",&a,&b); if(b>m||a>n)continue; else vec[a].push_back(b); } for(int i=1;i<=n;++i) { if(find(i,i)) ans++; } printf("%d ",ans); return 0; }