洛谷P3386 【模板】二分图匹配

题目背景

二分图

感谢@一扶苏一 提供的hack数据

题目描述

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

输入输出格式

输入格式:

第一行,n,m,e

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

输出格式:

共一行,二分图最大匹配

输入输出样例

输入样例#1: 
1 1 1
1 1
输出样例#1: 
1

说明

n,m1000,1un, 1vm

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

算法:二分图匹配

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 long long read()
 6 {
 7     long long x=0,f=1;
 8     char ch=getchar();
 9     while(ch<'0'||ch>'9')
10     {
11         if(ch=='-')
12             f=-1;
13         ch=getchar();
14     }
15     while(ch>='0'&&ch<='9')
16     {
17         x=x*10+ch-'0';
18         ch=getchar();
19     }
20     return x*f;
21 }
22 const int maxn=2005;
23 int n,m,e,ans;
24 int vis[maxn][maxn],ask[maxn],matched[maxn];
25 bool found(int x)
26 {
27     for(int i=1 ; i<=m ; i++)
28         if(vis[x][i])
29         {
30             if(ask[i])
31                 continue;
32             ask[i]=1;
33             if(!matched[i]||found(matched[i]))
34             {
35                 matched[i]=x ;
36                 return true;
37             }
38         }
39     return false;
40 }
41 void match()
42 {
43     int cnt=0;
44     memset(matched,0,sizeof(matched));
45     for(int i=1 ; i<=n ; i++)
46     {
47         memset(ask,0,sizeof(ask));
48         if(found(i))
49             cnt++;
50     }
51     ans=cnt;
52 }
53 int main()
54 {
55     n=read(),m=read(),e=read();
56     for(int i=1 ; i<=e ; i++)
57     {
58         int x,y;
59         x=read(),y=read();
60         vis[x][y]=1;
61     }
62     match();
63     printf("%d\n",ans);
64     return 0;
65 }
View Code

 

posted @ 2018-12-30 11:21  ~liweilin~  阅读(160)  评论(0编辑  收藏  举报