zoukankan      html  css  js  c++  java
  • P3386 【模板】二分图匹配

    链接:P3386

    --------------------------------

    这道题要用到一个名为匈牙利算法的东西

    匈牙利算法就是对于每一个点,(例如A)我们先从开始找一个点(例如B),如果他们相连,并且没有被拜访过(一个点一次只能被拜访一次),就让他们配对。然而,如果B已经和C配对了,就把C赶走,看看能不能找到一个D和C配对,如果有,就让C和D配对。让A和B配对。

    反之,就遍历下一个与A相连的点并重复以下步骤

    -------------------------------------

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 using namespace std;
     6 int map[2001][2001];
     7 int n,m,e;
     8 int vis[200001];
     9 int match[2000001];
    10 
    11 
    12 bool find (int x){
    13     for(int i=1;i<=m;++i){
    14         if(map[x][i]){
    15             if(vis[i])
    16             continue;//只能拜访一次 
    17             vis[i]=1;
    18             if(!match[i]||find(match[i])){//试图给他找下一个点 
    19                 match[i]=x;//配对 
    20                 return 1;
    21             }
    22             
    23         }
    24     }
    25     return 0;
    26 }
    27     int cnt=0;
    28 void deal(){
    29 
    30     memset (match,0,sizeof(match));
    31     for(int i=1;i<=n;++i){
    32         memset(vis,0,sizeof(vis));
    33         if(find(i))
    34         cnt++;//找到一个就+1 
    35     }
    36 }
    37 
    38 int main(){
    39     cin>>n>>m>>e;
    40     for(int i=1;i<=e;++i){
    41         int x,y;
    42         cin>>x>>y;
    43         map[x][y]=1;
    44     }
    45     deal();
    46     cout<<cnt;
    47     return 0;
    48     }
    Ac
  • 相关阅读:
    mxnet笔记
    8.1.18示例:使用forName()的扩展
    8.1.17使用1.2版本的用户自定义类装载器
    8.1.16 使用1.1版本的用户自定义类装载器
    8.1.13 _quick 指令
    8.1.12直接引用
    8.1.11编译时常量解析
    8.1.10装载约束
    8.1.8 解析CONSTANT_String_info入口
    8.1.7 解析CONSTANT_interfaceMethodref_info入口
  • 原文地址:https://www.cnblogs.com/For-Miku/p/11262816.html
Copyright © 2011-2022 走看看