zoukankan      html  css  js  c++  java
  • 【洛谷 p3386】模板-二分图匹配(图论)

    题目:给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数。

    解法:匈牙利算法。(以前我总是不记得......)实质上应该有贪心的思想,每次都尽量匹配,找到能和自己匹配的也尽量让它们匹配。若对方已有匹配的对象,就让那个对象尽量调整来使自己这对能凑起来。而要注意,每次问过的对象就不要再问了,也就是不要让它的对象总是换来换去......

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 using namespace std;
     6 
     7 const int N=1010,M=1010;
     8 int n,m,e;
     9 int vis[N][N];
    10 int ask[M],cp[M];
    11 
    12 bool ffind(int x)
    13 {
    14     for (int i=1;i<=m;i++)
    15       if (vis[x][i])
    16       {
    17         if (ask[i]) continue;
    18         ask[i]=1;
    19         if (!cp[i]||ffind(cp[i]))
    20         {cp[i]=x;return true;}
    21       }
    22     return false;
    23 }
    24 void getmatch()
    25 {
    26     int ans=0;
    27     memset(cp,0,sizeof(cp));
    28     for (int i=1;i<=n;i++)
    29     {
    30       memset(ask,0,sizeof(ask));
    31       if (ffind(i)) ans++;
    32     }
    33     printf("%d
    ",ans);
    34 }
    35 int main()
    36 {
    37     scanf("%d%d%d",&n,&m,&e);
    38     for (int i=1;i<=e;i++)
    39     {
    40       int x,y;
    41       scanf("%d%d",&x,&y);
    42       vis[x][y]=1;
    43     }
    44     getmatch();
    45     return 0;
    46 }
  • 相关阅读:
    46. 全排列
    90. 子集 II
    289. 生命游戏
    844. 比较含退格的字符串
    1266. 访问所有点的最小时间
    707. 设计链表
    DOM 关于dom的
    插件库
    浏览器判断
    FTP 客户端安装
  • 原文地址:https://www.cnblogs.com/konjak/p/6076835.html
Copyright © 2011-2022 走看看