zoukankan      html  css  js  c++  java
  • HDU2063过上车【匈牙利】

    大意:同学们去坐过山车,但是想要去做过山车必须是一个男同学一个女同学一起坐,

    现在告诉你每个女同学想要跟那些人一起坐,问最多能有多少对同学能够坐过山车

    男女同学人数都是<=500

    思路:

    将女同学跟其喜欢的男同学连一条边,然后求二分图的最大匹配即可。

    也可以用最大流来做,将源点与女同学之间建立一个容量为1的边,将女同学与其喜欢的男同学都建立一条容量为1的边,最后将男同学与汇点建立一条容量为1的边jike,求出最大刘即可。

    匈牙利算法,人数很少直接用的邻接矩阵存储的

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 const int maxn = 505;
     7 bool G[maxn][maxn];
     8 int Left[maxn];
     9 bool vis[maxn];
    10 int n, m;
    11 
    12 bool Find(int u) {
    13     for(int i = 1; i <= m; i++) {
    14         if(G[u][i] && !vis[i]) {
    15             vis[i] = true;
    16             if(Left[i] == -1 || Find(Left[i])) {
    17                 Left[i] = u;
    18                 return true;
    19             }
    20         }
    21     }
    22     return false;
    23 }
    24 
    25 void solve() {
    26     int num = 0;
    27     memset(Left, -1, sizeof(Left));
    28     for(int i = 1; i <= n; i++) {
    29         memset(vis, 0, sizeof(vis));
    30         if(Find(i)) num++;
    31     }
    32     printf("%d
    ",num);
    33 }
    34 
    35 int main() {
    36     int k;
    37     int u, v;
    38    // freopen("a.txt","r",stdin);
    39     while(scanf("%d",&k) && k) {
    40         scanf("%d %d",&n, &m);
    41         memset(G, false, sizeof(G));
    42         for(int i = 0; i < k; i++) {
    43             scanf("%d %d",&u, &v);
    44             G[u][v] = 1;
    45         }
    46         solve();
    47     }
    48     return 0;
    49 }
    View Code
  • 相关阅读:
    Spring、实例化Bean的三种方法
    Spring、编码剖析Spring管理Bean的原理
    Spring、Hello Spring
    Spring、控制反转与依赖注入(概念)
    Hibernate、批量操作数据
    Hibernate、3.6.7在线帮助文档
    Hibernate、乐观锁和悲观锁
    JQuery UI 精品UI推荐
    java 为pdf添加水印图片
    Hibernate 、继承关联映射
  • 原文地址:https://www.cnblogs.com/zhanzhao/p/3895910.html
Copyright © 2011-2022 走看看