zoukankan      html  css  js  c++  java
  • 二分图最大匹配--匈牙利算法

    关于算法的讲解,个人觉得这篇博文写得非常好:http://blog.csdn.net/dark_scope/article/details/8880547

    我的代码:

     1 #include <cstdio>
     2 #include <vector>
     3 #include <cstring>
     4 
     5 using namespace std;
     6 
     7 #define MAXN 1005
     8 
     9 vector<int> g[MAXN];
    10 int n, m, color[MAXN], mm[MAXN];
    11 bool used[MAXN];
    12 
    13 bool isBiGraph(int x, int co)
    14 {
    15     bool ret = true;
    16     color[x] = co;
    17     int sz = g[x].size();
    18     for(int i=0; i<sz; ++i)
    19     {
    20         int y = g[x][i];
    21         if(color[y]<0)
    22         {
    23             ret = ret&&isBiGraph(y, co^1);
    24             if(!ret) return ret;
    25         }
    26         else if(color[y]==co)   return false;
    27     }
    28     return ret;
    29 }
    30 
    31 bool findm(int x)
    32 {
    33     int sz = g[x].size();
    34     for(int i=0; i<sz; ++i)
    35     {
    36         int y = g[x][i];
    37         if(!used[y])
    38         {
    39             used[y] = true;
    40             if(mm[y]==0 || findm(mm[y]))
    41             {
    42                 mm[x] = y;
    43                 mm[y] = x;
    44                 return true;
    45             }
    46         }
    47     }
    48     return false;
    49 }
    50 
    51 void init()
    52 {
    53     for(int i=1; i<=n; ++i) g[i].clear();
    54     memset(color+1, -1, n*sizeof(int));
    55     memset(mm+1, 0, n*sizeof(int));
    56 }
    57 
    58 int main()
    59 {
    60     while(scanf("%d%d", &n, &m)!=EOF)
    61     {
    62         init();
    63         while(m--)
    64         {
    65             int u, v;
    66             scanf("%d%d", &u, &v);
    67             g[u].push_back(v);
    68             g[v].push_back(u);
    69         }
    70         if(isBiGraph(1, 0))
    71         {
    72             int ans = 0;
    73             for(int i=1; i<=n; ++i)
    74             {
    75                 if(color[i])
    76                 {
    77                     memset(used+1, 0, n);
    78                     if(findm(i)) ++ans;
    79                 }
    80             }
    81             printf("%d
    ", ans);
    82         }
    83         else puts("0");
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    centos 配置php
    Linux下端口被占用解决
    LUOGU P1040 加分二叉树
    bzoj 1057: [ZJOI2007]棋盘制作
    1858: [Scoi2010]序列操作
    poj 2559 Largest Rectangle in a Histogram
    2018/7/19 模拟赛
    SPOJ 2916 GSS5
    BZOJ 4004: [JLOI2015]装备购买
    CF 549B Looksery Party
  • 原文地址:https://www.cnblogs.com/pczhou/p/4298030.html
Copyright © 2011-2022 走看看