二分图最大匹配

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define re register
 6 #define rep(i, a, b) for (re int i = a; i <= b; ++i)
 7 #define repd(i, a, b) for (re int i = a; i >= b; --i)
 8 #define maxx(a, b) a = max(a, b);
 9 #define minn(a, b) a = min(a, b);
10 #define LL long long
11 #define inf (1 << 30)
12 
13 inline int read() {
14     int w = 0, f = 1; char c = getchar();
15     while (!isdigit(c)) f = c == '-' ? -1 : f, c = getchar();
16     while (isdigit(c)) w = (w << 3) + (w << 1) + (c ^ '0'), c = getchar();
17     return w * f;
18 }
19 
20 const int maxn = 1000 + 5;
21 
22 int e[maxn << 1][maxn << 1], v[maxn], lk[maxn];
23 int n, m, E;
24 
25 bool find(int u) {
26     rep(i, 1, m)
27         if (!v[i] && e[u][i+n]) {
28             v[i] = 1;
29             if (!lk[i] || find(lk[i])) {
30                 lk[i] = u;
31                 return true;
32             }
33         }
34     return false;
35 }
36 
37 int main() {
38     n = read(), m = read(), E = read();
39 
40     rep(i, 1, E) {
41         register int u = read(), v = read();
42         e[u][v+n] = e[v+n][u] = 1;
43     }
44 
45     int cnt = 0;
46     rep(i, 1, n) {
47         memset(v, 0, sizeof(v)); // 如果题目要求比较高,不要用这句话,改为时间戳判断。
48         if (find(i)) cnt++;
49     }
50 
51     printf("%d", cnt);
52     return 0;
53 }

 

转载于:https://www.cnblogs.com/ac-evil/p/10339847.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值