zoukankan      html  css  js  c++  java
  • 洛谷—— P3386 【模板】二分图匹配

    https://www.luogu.org/problem/show?pid=3386

    题目背景

    二分图

    题目描述

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

    输入输出格式

    输入格式:

    第一行,n,m,e

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

    输出格式:

    共一行,二分图最大匹配

    输入输出样例

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

    说明

    n,m<=1000,1<=u<=n,1<=v<=m

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

    算法:二分图匹配

    匈牙利算法:

     1 #include <algorithm>
     2 #include <cstring>
     3 #include <cstdio>
     4 
     5 using namespace std;
     6 
     7 const int N(1010);
     8 int n,m,e,u,v,ans;
     9 int map[N][N];
    10 
    11 int match[N],vis[N];
    12 
    13 bool DFS(int now)
    14 {
    15     for(int i=1;i<=m;i++)
    16         if(map[now][i]&&!vis[i])
    17         {    //有好感 正单身 
    18             vis[i]=1;    //尝试一下 
    19             if(!match[i]||DFS(match[i]))
    20             {    //对方正单身, 对方开始尝试 
    21                 match[i]=now;    //尝试成功 
    22                 return true;
    23             }
    24         }
    25     return false;
    26 }
    27 
    28 int main()
    29 {    
    30     scanf("%d%d%d",&n,&m,&e);
    31     for(;e;e--)
    32     {
    33         scanf("%d%d",&u,&v);
    34         if(u>n||v>m) continue; 
    35         map[u][v]=1;
    36     }
    37     for(int i=1;i<=n;i++)
    38     {
    39         memset(vis,0,sizeof(vis));
    40         if(DFS(i)) ans++;    //配对成功 
    41     }
    42     printf("%d
    ",ans);
    43     return 0;
    44 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    java 使用相对路径读取文件
    appium 使用过程问题踩坑-笔记
    CentOS下启动Tomcat
    jodis遇到的问题
    CentOS 7.0 防火墙
    sentinel
    keepalived
    在Tomat7上使用Redis保存Session
    Log4j 使用
    java路径问题
  • 原文地址:https://www.cnblogs.com/Shy-key/p/6885063.html
Copyright © 2011-2022 走看看