• 二分图最大匹配匈牙利算法模板两种


    1.邻接表(vector向量法)

    vector<int> G[N];
    
    int Search_Path(int s)
    {
        for(int i=0;i<G[s].size();i++)
        {
            int v = G[s][i];
            if(!vis[v])
            {
                vis[v] = 1;
                if(match[v] == -1 || Search_Path(match[v]))
                {
                    match[v] = s;
                    return 1;
                }
            }
        }
        return 0;
    }
    
    //主函数中
    
    for(i=0;i<=n;i++)
            G[i].clear();
    memset(match,-1,sizeof(match));
    cnt = 0;
        for(i=0;i<n;i++)
        {
            memset(vis,0,sizeof(vis));
            if(Search_Path(i))
                cnt++;
        }
    View Code

    2.邻接表(前向星法)

    struct Edge
    {
        int v,next;
    }G[N];
    
    int Search_Path(int s)
    {
        for(int i=first[s];i!=-1;i=G[i].next)
        {
            int v = G[i].v;
            if(!vis[v])
            {
                vis[v] = 1;
                if(match[v] == -1 || Search_Path(match[v]))
                {
                    match[v] = s;
                    return 1;
                }
            }
        }
        return 0;
    }
    
    //主函数里面一样
    View Code

    3.邻接矩阵法

    int path[N][N];
    int Search_Path(int s)
    {
        for(int i=0;i<m;i++)
        {
            if(path[s][i] && !vis[i])
            {
                vis[i] = 1;
                if(match[i] == -1 || Search_Path(match[i]))
                {
                    match[i] = s;
                    return 1;
                }
            }
        }
        return 0;
    }
    
    
    //主函数中一样
    View Code

    附:HDU 2063 过山车

    裸的二分图最大匹配。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    #define N 1007
    
    int path[N][N],vis[N];
    int match[N];
    int n,m;
    
    int Search_Path(int s)
    {
        for(int i=1;i<=m;i++)
        {
            if(path[s][i] && !vis[i])
            {
                vis[i] = 1;
                if(match[i] == -1 || Search_Path(match[i]))
                {
                    match[i] = s;
                    return 1;
                }
            }
        }
        return 0;
    }
    
    int main()
    {
        int cnt,i,j,k;
        int a,b;
        while(scanf("%d",&k)!=EOF && k)
        {
            scanf("%d%d",&n,&m);
            memset(match,-1,sizeof(match));
            memset(path,0,sizeof(path));
            for(i=0;i<k;i++)
            {
                scanf("%d%d",&a,&b);
                path[a][b] = 1;
            }
            cnt = 0;
            for(i=1;i<=n;i++)
            {
                memset(vis,0,sizeof(vis));
                if(Search_Path(i))
                    cnt++;
            }
            printf("%d
    ",cnt);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    shell 字符串切分成数组
    RDD关键性能考量之 内存管理
    RDD关键性能考量之 序列化格式
    【转】Linux ln(link) 命令详解
    【转】redis配置认证密码
    【转】MongoDB 知识要点一览
    RDD关键性能考量之 并行度
    使用thumbnailator不按照比例,改变图片的大小
    Linux服务器redhat配置本地yum源
    Oracle表字段的增删改和重命名
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3767837.html
Copyright © 2020-2023  润新知