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

題目背景

二分圖html

感謝@一扶蘇一 提供的hack數據ios

題目描述

給定一個二分圖,結點個數分別爲n,m,邊數爲e,求二分圖最大匹配數算法

輸入輸出格式

輸入格式:ide

第一行,n,m,espa

第二至e+1行,每行兩個正整數u,v,表示u,v有一條連邊code

輸出格式:htm

共一行,二分圖最大匹配blog

輸入輸出樣例

輸入樣例#1: 
1 1 1
1 1
輸出樣例#1: 
1

說明

n,m1000,1un, 1vmget

由於數據有坑,可能會遇到 v>mv 的狀況。請把 v>m的數據自覺過濾掉。string

算法:二分圖匹配

 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
相關文章
相關標籤/搜索