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

    原题地址

    只能说匈牙利算法不能更屌,而且提示里给的伪码也不能更屌了!

    只用了第二个优化,因为将输入点集分割成A、B似乎挺麻烦的,索性就没用这个优化。

    代码:

     1 #include <iostream>
     2 #include <cstring>
     3 
     4 using namespace std;
     5 
     6 #define MAX_VERTEX 1024
     7 
     8 int N, M;
     9 
    10 bool g[MAX_VERTEX][MAX_VERTEX];
    11 int m[MAX_VERTEX]; // match[vi] = ui 表示vi节点匹配的节点是ui
    12 bool c[MAX_VERTEX]; // cover[vi] = true or false 表示vi节点是否已经被查询过了
    13 
    14 bool findPath(int u) {
    15   for (int i = 1; i <= N; i++) {
    16     if (!g[u][i] || c[i])
    17       continue;
    18     c[i] = true;
    19     if (!m[i] || findPath(m[i])) {
    20       m[u] = i;
    21       m[i] = u;
    22       return true;
    23     }
    24   }
    25   return false;
    26 }
    27 
    28 int solve() {
    29   int res = 0;
    30 
    31   for (int i = 1; i <= N; i++) {
    32     memset(c, 0, sizeof(c));
    33     if (!m[i] && findPath(i))
    34       res++;
    35   }
    36 
    37   return res;
    38 }
    39 
    40 int main() {
    41   memset(g, 0, sizeof(g));
    42   memset(m, 0, sizeof(m));
    43   scanf("%d%d", &N, &M);
    44   for (int i = 0; i < M; i++) {
    45     int u, v;
    46     scanf("%d%d", &u, &v);
    47     g[u][v] = g[v][u] = true;
    48   }
    49   printf("%d
    ", solve());
    50   return 0;
    51 }
  • 相关阅读:
    [无聊测试赛] T12 道路
    [无聊测试赛] T9 矩阵覆盖
    [无聊测试赛] T10 所驼门王的宝藏
    [无聊测试赛] T8 佳佳的魔法药水
    [无聊测试赛] T7 豪华游轮
    [无聊测试赛] T6 排行榜
    【模板】三分求函数极值
    树的重心模板
    倍增最近公共祖先(LCA)
    ccf201612题解
  • 原文地址:https://www.cnblogs.com/boring09/p/4400911.html
Copyright © 2011-2022 走看看