二分图模板(洛谷P3386)

Posted mljkw-gsry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分图模板(洛谷P3386)相关的知识,希望对你有一定的参考价值。

题目背景

二分图

题目描述

给定一个二分图,结点个数分别为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>m 的情况。请把 v>mv>m 的数据自觉过滤掉。

技术分享图片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define maxn 5010
 5 using namespace std;
 6 inline int read()
 7 {
 8     int x=0,f=1;
 9     char ch=getchar();
10     while(ch<0||ch>9) 
11     {
12         if(ch==-) 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 int ecnt,head[maxn],link[maxn],vis[maxn],n,m,e,ans;
23 struct edge
24 {
25     int u,v,next;
26 }E[maxn*maxn];
27 void add(int u,int v)
28 {
29     E[++ecnt].u=u;
30     E[ecnt].v=v;
31     E[ecnt].next=head[u];
32     head[u]=ecnt;
33 }
34 int dfs(int x)
35 {
36     for(int i=head[x];i;i=E[i].next)
37     {
38         int v=E[i].v;
39         if(!vis[v])
40         {
41             vis[v]=1;
42             if(!link[v]||dfs(link[v]))
43             {
44                 link[v]=x;return 1;
45              } 
46         }
47     }
48     return 0;
49 }
50 int main()
51 {
52     n=read();m=read();e=read();
53     for(int i=1;i<=e;++i)
54     {
55         int a=read(),b=read();
56         if(a>n||b>m) continue;
57         add(a,b);
58     }
59     for(int i=1;i<=n;++i)
60     {
61         memset(vis,0,sizeof(vis));
62         if(dfs(i)) ++ans;
63     }
64     printf("%d\n",ans);
65     return 0;
66 }
View Code

 



以上是关于二分图模板(洛谷P3386)的主要内容,如果未能解决你的问题,请参考以下文章

二分图模板(洛谷P3386)

二分图匹配([洛谷]P3386 模板 二分图匹配)

洛谷P3386 模板二分图匹配

洛谷P3386模板二分图匹配

洛谷P3386——二分图匹配

AC日记——模板二分图匹配 洛谷 P3386