• 二分图匹配


    题目背景

    二分图

    题目描述

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

    输入输出格式

    输入格式:

    第一行,n,m,e

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

    输出格式:

    共一行,二分图最大匹配

    输入输出样例

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

    说明

    n,m leq 1000n,m1000, 1 leq u leq n1un, 1 leq v leq m1vm

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

    算法:二分图匹配

    显然,是个板子题,现在才知道考场上自己yy的二分图多么恶心+丑陋

    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn = 10086;
    vector<int>vec[10086];
    int n,m,e,used[maxn],link[maxn];
    bool find(int x,int f) {
        for(int i=0;i<vec[x].size();++i) {
            int v=vec[x][i];
            if(used[v]!=f) {//此操作可省略memset vis 判断本轮有没有搜索 
                used[v]=f;
                if(link[v]==-1||find(link[v],f)) {
                    link[v]=x;return true;
                }
            }
        }
        return 0;
    }
    int main() {
        int ans=0;
        scanf("%d%d%d",&n,&m,&e);
        memset(link,-1,sizeof(link));
        for(int i=1,a,b;i<=e;++i) {
            scanf("%d%d",&a,&b);
            if(b>m||a>n)continue;
            else vec[a].push_back(b);
        }
        for(int i=1;i<=n;++i) {
            if(find(i,i))
                ans++;
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    git
    oracle object_id和data_object_id的区别
    statspack系列8
    statspack系列7
    statspack系列6
    statspack系列5
    statspack系列4
    statspack系列3
    statspack系列2
    MySQL源码之两阶段提交
  • 原文地址:https://www.cnblogs.com/sssy/p/7751479.html
Copyright © 2020-2023  润新知