zoukankan      html  css  js  c++  java
  • 二分图匹配

    题目背景

    二分图

    题目描述

    给定一个二分图,结点个数分别为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;
    }
  • 相关阅读:
    CSS3——复杂选择器
    单元测试覆盖率设置
    你必须了解的「架构」小历史
    js正则表达式:学习网址和部分正则验证
    转: js实现全角半角检测的方法
    Linux and the Unix Philosophy(1)
    HTML DOM 对象
    理解css中的 content:" " 是什么意思
    JS
    js
  • 原文地址:https://www.cnblogs.com/sssy/p/7751479.html
Copyright © 2011-2022 走看看