zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Kafka发送和接收消息
    Kafka主题topic的增删改查
    Kafka启动
    synchronize底层实现原理
    StringBuffer和StringBuilder的区别
    常见的排序算法
    Redis缓存穿透,缓存击穿,缓存雪崩原理及解决方案
    Redis持久化策略
    redis支持的数据类型
    Bytes 类型
  • 原文地址:https://www.cnblogs.com/rainydays/p/2023761.html
Copyright © 2011-2022 走看看