• hdu 2063 过山车 (二分图,最大匹配)


    过山车
    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 29622    Accepted Submission(s): 12773

    Problem Description
    RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?
     
    Input
    输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
    1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
     
    Output
    对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。
     
    Sample Input
    6 3 3
    1 1
    1 2
    1 3
    2 1
    2 3
    3 1
    0
     
    Sample Output
    3

    C/C++:

     1 #include <map>
     2 #include <queue>
     3 #include <cmath>
     4 #include <vector>
     5 #include <string>
     6 #include <cstdio>
     7 #include <cstring>
     8 #include <climits>
     9 #include <iostream>
    10 #include <algorithm>
    11 #define INF 0xffffff
    12 using namespace std;
    13 const int my_max = 505;
    14 
    15 int k, m, n, a, b, my_line[my_max][my_max], my_book[my_max], my_right[my_max];
    16 
    17 bool my_dfs(int x)
    18 {
    19     for (int i = 1; i <= n; ++ i)
    20     {
    21         if (!my_book[i] && my_line[x][i])
    22         {
    23             my_book[i] = 1;
    24             if (my_right[i] == 0 || my_dfs(my_right[i]))
    25             {
    26                 my_right[i] = x;
    27                 return true;
    28             }
    29         }
    30     }
    31     return false;
    32 }
    33 
    34 int main()
    35 {
    36     while (scanf("%d", &k), k)
    37     {
    38         int my_ans = 0;
    39         memset(my_right, 0, sizeof(my_right));
    40         memset (my_line, 0, sizeof(my_line));
    41         scanf("%d%d", &m, &n);
    42         while (k --)
    43         {
    44             scanf("%d%d", &a, &b);
    45             my_line[a][b] = 1;
    46         }
    47         for (int i = 1; i <= m; ++ i)
    48         {
    49             memset (my_book, 0, sizeof(my_book));
    50             if (my_dfs(i))
    51                 my_ans ++;
    52         }
    53 
    54         printf("%d
    ", my_ans);
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    类的加载过程
    ASCII码表
    uboot main_loop函数分析
    串行CPU设计
    __attribute__ ((section(".text")))的测试
    NandFlash
    测试gcc的优化选项
    如何编写一个简单的makefile
    UBOOT的多支持性与可裁剪性
    函数指针的使用
  • 原文地址:https://www.cnblogs.com/GetcharZp/p/9460473.html
Copyright © 2020-2023  润新知