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;
    }
  • 相关阅读:
    SD卡测试
    测试人员可能会遇到的问题
    HDU 1024 Max Sum Plus Plus
    HDU 1176 免费馅饼
    HDU 1257 最少拦截系统
    HDU 1087 Super Jumping! Jumping! Jumping!
    poj 1328 Radar Installation
    poj 1753 Flip Game
    HDU 1003 Max Sum
    HDU 5592 ZYB's Premutation(BestCoder Round #65 C)
  • 原文地址:https://www.cnblogs.com/sssy/p/7751479.html
Copyright © 2011-2022 走看看