zoukankan      html  css  js  c++  java
  • 图论,匈牙利算法

    匈牙利算法

     USACO 4.2.2 The Perfect Stall 完美的牛栏

    这是一种用增广路求二分图最大匹配的算法。它由匈牙利数学家Edmonds于1965年提出,因而得名。 定义 未盖点:设Vi是图G的一个顶点,如果Vi 不与任意一条属于匹配M的边相关联,就称Vi 是一个未盖点。

    交错路:设P是图G的一条路,如果P的任意两条相邻的边一定是一条属于M而另一条不属于M,就称P是一条交错路。

    可增广路:两个端点都是未盖点的交错路叫做可增广路。 

    流程图

    伪代码:

    bool 寻找从k出发的对应项出的可增广路
    {
        while (从邻接表中列举k能关联到顶点j)
        {
            if (j不在增广路上)
            {
                把j加入增广路;
                if (j是未盖点 或者 从j的对应项出发有可增广路)
                {
                    修改j的对应项为k;
                    则从k的对应项出有可增广路,返回true;
                }
            }
        }
        则从k的对应项出没有可增广路,返回false;
    }
    
    void 匈牙利hungary()
    {
        for i->1 to n
        {
            if (则从i的对应项出有可增广路)
                匹配数++;
        }
        输出 匹配数;
    }

    演示

    C实现

    #include <stdio.h>
    #include <string.h>
    #define MAX 102
    
    long n,n1,match;
    long adjl[MAX][MAX];
    long mat[MAX];
    bool used[MAX];
    
    FILE *fi,*fo;
    
    void readfile()
    {
        fi=fopen("flyer.in","r");
        fo=fopen("flyer.out","w");
        fscanf(fi,"%ld%ld",&n,&n1);
        long a,b;
        while (fscanf(fi,"%ld%ld",&a,&b)!=EOF)
            adjl[a][ ++adjl[a][0] ]=b;
        match=0;
    }
    
    bool crosspath(long k)
    {
        for (long i=1;i<=adjl[k][0];i++)
        {
            long j=adjl[k][i];
            if (!used[j])
            {
                used[j]=true;
                if (mat[j]==0 || crosspath(mat[j]))
                {
                    mat[j]=k;
                    return true;
                }
            }
        }
        return false;
    }
    
    void hungary()
    {
        for (long i=1;i<=n1;i++)
        {
            if (crosspath(i))
                match++;
            memset(used,0,sizeof(used));
        }
    }
    
    void print()
    {
        fprintf(fo,"%ld",match);
        fclose(fi);
        fclose(fo);
    }
    
    int main()
    {
        readfile();
        hungary();
        print();
        return 0;
    }
  • 相关阅读:
    Zabbix5 Frame 嵌套
    Zabbix5 对接 SAML 协议 SSO
    CentOS7 安装 Nexus
    CentOS7 安装 SonarQube
    GitLab 后台修改用户密码
    GitLab 查看版本号
    GitLab Admin Area 500 Error
    Linux 安装 PostgreSQL
    Liger ui grid 参数
    vue.js 是一个怪东西
  • 原文地址:https://www.cnblogs.com/tham/p/6827412.html
Copyright © 2011-2022 走看看