• 南阳239----月老的难题『匈牙利算法』


     1 /*
     2 匈牙利算法模版题
     3 邻接表实现,邻接矩阵超时
     4 最大匹配问题
     5  */
     6 #include <cstdio>
     7 #include <vector>
     8 #include <cstring>
     9 using namespace std;
    10 const int maxn = 505;
    11 vector<int> v[maxn];//x = v[i][j]表示i可以与x进行匹配
    12 int vis[maxn],match[maxn];//vis[i]表示i已经访问(匹配)过为了防止在每次dfs中重复访问某点,x = match[i]表示x现在和i匹配
    13 bool dfs(int x)
    14 {
    15     for(int i = 0; i < v[x].size(); ++i)
    16     {
    17         int t = v[x][i];
    18         if(!vis[t])
    19         {
    20             vis[t] = 1;
    21             if(match[t] == -1 || dfs(match[t]))
    22             {match[t] = x; return true;}
    23         }
    24     }
    25     return false;
    26 }
    27 int hungary(int n)
    28 {
    29     int ans = 0;
    30     for(int i = 1; i <= n; ++i)
    31     {
    32         memset(vis,0,sizeof vis);
    33         if(dfs(i)) ++ans;
    34     }
    35     return ans;
    36 }
    37 int main()
    38 {
    39     int t,n,m,x,y;
    40     scanf("%d",&t);
    41     while(t--)
    42     {
    43         scanf("%d%d",&n,&m);
    44         for(int i = 1; i <= n; ++i)
    45             v[i].clear();
    46         memset(match, -1, sizeof match);
    47         while(m--)
    48         {
    49             scanf("%d%d",&x,&y);
    50             v[x].push_back(y);
    51         }
    52         printf("%d
    ",hungary(n));
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    Ducking
    MINITAB(二)
    JFreechart
    linux命令0424
    JAVA哈哈镜
    HTML(四)
    The 3n+1 problem
    [转载]:【读书笔记】.NET本质论
    ER图基本步骤
    [从架构到设计]第一回:设计,应该多一点(转载)
  • 原文地址:https://www.cnblogs.com/qq188380780/p/7356545.html
Copyright © 2020-2023  润新知