zoukankan      html  css  js  c++  java
  • 二分图匹配(匈牙利算法模板)

    最大匹配——匈牙利算法

     1 /****************************************************
     2 二分图匹配(匈牙利算法的DFS实现)
     3 INIT:g[][]两边定点划分的情况
     4 CALL:res=hungary();输出最大匹配数
     5 优点:适于稠密图,DFS找增广路快,实现简洁易于理解
     6 时间复杂度:O(VE);
     7 ****************************************************/
     8 #include <iostream>
     9 #include <cstdio>
    10 #include <cstring>
    11 using namespace std;
    12 const int MAXN=1000;
    13 int uN, vN;  //u,v数目
    14 int g[MAXN][MAXN];//编号是0~n-1的 
    15 int match[MAXN];
    16 int f[MAXN];
    17 
    18 bool dfs(int u)
    19 {
    20     for (int i = 0; i < vN; i++)
    21         if (g[u][i] && !f[i])
    22         {
    23             f[i] = 1;
    24             if (match[i] == -1 || dfs(match[i]))
    25             {
    26                 match[i] = u;
    27                 return true;
    28             }
    29         }
    30     return false;
    31 }
    32 
    33 int hungary()
    34 {
    35     int ans = 0;
    36     memset(match, -1, sizeof(match));
    37     for (int i = 0; i < uN; i++)
    38     {
    39          memset(f, 0, sizeof(f));
    40         if (dfs(i))
    41             ans++;
    42     }
    43     return ans;
    44 }
    View Code

    相关的题有

    HDU 1045

    HDU 2063过山车

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 using namespace std;
     6 
     7 #define N 505
     8 
     9 int map[N][N], flag[N];
    10 int pre[N];
    11 int n, m, num;
    12 
    13 int dfs(int cur)
    14 {
    15     for (int i = 1; i <= m ;i++)
    16     {
    17         if (map[cur][i] && !flag[i])
    18         {
    19             flag[i] = 1;
    20             if (pre[i] == -1 || dfs(pre[i]))
    21             {
    22                 pre[i] = cur;
    23                 return 1;
    24             }
    25         }
    26     }
    27     return 0;
    28 }
    29 
    30 int main()
    31 {
    32     int girl, boy, sum;
    33     while (cin >> num && num)
    34     {
    35         cin >> n >> m;
    36         memset(map, 0, sizeof(map));
    37         memset(pre, -1, sizeof(pre));
    38         for (int i = 0; i < num; i++)
    39         {
    40             cin >> girl >> boy;
    41             map[girl][boy] = 1;
    42         }
    43         sum = 0;
    44         for (int i = 1; i <= n; i++)
    45         {
    46             memset(flag, 0, sizeof(flag));
    47             sum += dfs(i);
    48         }
    49         cout << sum << endl;
    50     }
    51     return 0;
    52 }
    View Code
  • 相关阅读:
    [LuoguP2161] 会场预约
    [LuoguP1198] 最大数
    [LuoguP1484] 种树
    [LuoguP1801] 黑匣子
    [LuoguP1196]银河英雄传说
    [LuoguP1345] 奶牛的电信Telecowmunication
    [LuoguP1119]灾后重建
    【笔记】一元函数微分学
    【复习】Listening and Reading Comprehension
    【笔记】一元函数的不定积分
  • 原文地址:https://www.cnblogs.com/KimKyeYu/p/3175990.html
Copyright © 2011-2022 走看看