• hoj1150


    二分图的最小顶点覆盖等于最大匹配。所以直接用匈牙利算法。

    建图时,每个mode作为一个节点,每个作业是连接两个mode的一条边。

    View Code
    #include <iostream>
    #include
    <cstdio>
    #include
    <cstdlib>
    #include
    <cstring>
    using namespace std;
    const int MAXN = 105;
    int uN, vN; // u, v数目,要初始化!!!
    bool g[MAXN][MAXN]; // g[i][j] 表示xi与yj相连
    int xM[MAXN], yM[MAXN]; // 输出量
    bool chk[MAXN]; // 辅助量检查某轮y[v]是否被check
    int n, m, k;

    bool SearchPath(int u){
    int v;
    for(v = 0; v < vN; v++)
    if(g[u][v] && !chk[v])
    {
    chk[v]
    = true;
    if(yM[v] == -1 || SearchPath(yM[v]))
    {
    yM[v]
    = u; xM[u] = v;
    return true ;
    }
    }
    return false ;
    }
    int MaxMatch(){
    int u, ret = 0 ;
    memset(xM,
    -1, sizeof (xM));
    memset(yM,
    -1, sizeof (yM));
    for(u = 0; u < uN; u++)
    if(xM[u] == -1){
    memset(chk,
    false, sizeof (chk));
    if(SearchPath(u)) ret++;
    }
    return ret;
    }

    void input()
    {
    scanf(
    "%d%d", &m, &k);
    memset(g,
    0, sizeof(g));
    for (int i = 0; i < k; i++)
    {
    int a, b, c;
    scanf(
    "%d%d%d", &a, &b, &c);
    if (b && c)
    g[b][c]
    = true;
    }
    uN
    = n;
    vN
    = m;
    }

    int main()
    {
    //freopen("D:\\t.txt", "r", stdin);
    while (scanf("%d", &n) != EOF && n != 0)
    {
    input();
    printf(
    "%d\n", MaxMatch());
    }
    return 0;
    }
  • 相关阅读:
    Leetcode 171. Excel Sheet Column Number
    Leetcode 206 Reverse Linked List
    Leetcode 147. Insertion Sort List
    小明一家人过桥
    Leetcode 125. Valid Palindrome
    Leetcode 237. Delete Node in a Linked List
    Leetcode 167 Two Sum II
    张老师的生日
    Leetcode 27. Remove Element
    Leetcode 283. Move Zeroes
  • 原文地址:https://www.cnblogs.com/rainydays/p/2023761.html
Copyright © 2020-2023  润新知