• 匈牙利算法dfs模板 [二分图][二分图最大匹配]


    最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs

    于是用到了dfs模板

    寻找二分图最大匹配的算法是匈牙利算法

    匈牙利算法的主要程序是寻找增广路

    寻找增光路是过程是:从一个未经配对的点出发,历经未配边、匹配边、未配边、匹配边、未配边、...最终到达一个未配点的过程,只要把路径中的未配边和匹配边的“身份”对调,匹配就加一了。这就是一个寻找增广路的过程,通过不断寻找增广路,可以找到最大的匹配。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 
     6 struct Edge{
     7     int to,nxt;
     8     Edge(int to=0,int nxt=0):
     9         to(to),nxt(nxt){}
    10 };
    11 
    12 const int maxn=2005,maxm=1000005;
    13 
    14 Edge E[maxm<<1];
    15 int head[maxn],mat[maxn];
    16 bool check[maxn];
    17 int n,n_l,n_r,m,cnt=0;
    18 
    19 bool dfs(int u){
    20     for(int e=head[u];e;e=E[e].nxt){
    21         int v=E[e].to;
    22         if(!check[v]){
    23             check[v]=1;
    24             if(mat[v]==-1||dfs(mat[v])){
    25                 mat[v]=u;
    26                 mat[u]=v;
    27                 return 1;
    28             }
    29         }
    30     }
    31     return 0;
    32 }
    33 
    34 void hungarian(){
    35     int ans=0;
    36     memset(mat,-1,sizeof mat);
    37     for(int u=1;u<=n_l;u++)
    38         if(mat[u]==-1){
    39             memset(check,0,sizeof check);
    40             if(dfs(u))  ans++;
    41         }
    42     printf("%d
    ",ans);
    43 }
    44 
    45 inline void ad_e(int from=0,int to=0){
    46     E[++cnt]=Edge(to,head[from]);
    47     head[from]=cnt;
    48     E[++cnt]=Edge(from,head[to]);
    49     head[to]=cnt;
    50 }
    51 
    52 void init(){
    53     scanf("%d%d%d",&n_l,&n_r,&m);
    54     for(int i=0,ff,tt;i<m;i++){
    55         scanf("%d%d",&ff,&tt);
    56         if(tt>n_r)  continue;
    57         ad_e(ff,tt+n_l);
    58     }
    59 }
    60 
    61 int main(){
    62     init();
    63     hungarian();
    64     return 0;
    65 }
  • 相关阅读:
    Java之内部类
    java之对象的前世今生
    java之继承
    java之接口
    何为大学 大学何为?
    丁香般的姑娘
    MySQL创建数据库与创建用户以及授权
    CentOS6.8手动安装MySQL5.6
    linux 修改myql 编码配置等信息参考
    Centos6.8 Mysql5.6 安装配置教程
  • 原文地址:https://www.cnblogs.com/ZYBGMZL/p/7247771.html
Copyright © 2020-2023  润新知