打卡信奥刷题(2720)用C++实现信奥题 P3386 【模板】二分图最大匹配

P3386 【模板】二分图最大匹配

题目描述

给定一个二分图,其左部点的个数为 nnn,右部点的个数为 mmm,边数为 eee,求其最大匹配的边数。

左部点从 111nnn 编号,右部点从 111mmm 编号。

输入格式

输入的第一行是三个整数,分别代表 nnnmmmeee

接下来 eee 行,每行两个整数 u,vu, vu,v,表示存在一条连接左部点 uuu 和右部点 vvv 的边。

输出格式

输出一行一个整数,代表二分图最大匹配的边数。

输入输出样例 #1

输入 #1

1 1 1
1 1

输出 #1

1

输入输出样例 #2

输入 #2

4 2 7
3 1
1 2
3 2
1 1
4 2
4 1
1 1

输出 #2

2

说明/提示

数据规模与约定

对于全部的测试点,保证:

  • 1≤n,m≤5001 \leq n, m \leq 5001n,m500
  • 1≤e≤5×1041 \leq e \leq 5 \times 10^41e5×104
  • 1≤u≤n1 \leq u \leq n1un1≤v≤m1 \leq v \leq m1vm

不保证给出的图没有重边

C++实现

#include <bits/stdc++.h>
using namespace std;

int n, m, e, ans;
int tim[505]; //时间戳防重边
int rec[505]; //记录谁与谁配对
vector < int > edge[505]; //存边
bool dfs(int x, int t) { //当前节点, 时间戳
    if (tim[x] == t) return false; //当前轮次已访问直接返回
    tim[x] = t; //标记
    for (auto y : edge[x]) 
        if (rec[y] == 0 || dfs(rec[y], t)) {
            rec[y] = x; //匹配
            return true;
        }

    return false;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> m >> e;
    for (int i = 1; i <= e; i++) {
        int x, y;
        cin >> x >> y;
        edge[x].push_back(y);
    }
    for (int i = 1; i <= n; i++)
        if (dfs(i, i)) ans++;
    cout << ans << endl;
    return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值