zoukankan      html  css  js  c++  java
  • 过山车

    过山车 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    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
     题意,公司同事出去坐过山车,女生只愿意和部分(一个或多个,中的某一个坐一起坐过山车,一个男生只能陪一个女生, 问最多可以有几个女孩可以坐过山车,
    匈牙利~
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 
     5 using namespace std;
     6 
     7 #define N 1010
     8 
     9 int n, m, used[N], cnt[N], vis[N];
    10 int maps[N][N];
    11 
    12 void init()
    13 {
    14     memset(used, 0, sizeof(used));
    15     memset(cnt, 0, sizeof(cnt));
    16     memset(maps, 0, sizeof(maps));
    17     memset(vis, 0, sizeof(vis));
    18 }
    19 
    20 int found(int u)
    21 {
    22     for(int i = 1; i <= n; i++)
    23     {
    24         if(maps[u][i] && !vis[i])
    25         {
    26             vis[i] = 1;   // 已经被访问过的不会被访问,
    27 
    28             if( !used[i] || found(used[i]))
    29             {
    30                 used[i] = u;
    31                 return true;
    32             }
    33         }
    34     }
    35     return false;
    36 }
    37 
    38 int main()
    39 {
    40     int k, a, b;
    41 
    42     while(scanf("%d", &k), k)
    43     {
    44         init();
    45 
    46         int ans = 0;
    47 
    48         scanf("%d%d", &m, &n);
    49 
    50         while(k--)
    51         {
    52             scanf("%d%d", &a, &b);
    53             maps[a][b] = 1;
    54             //used[b] = a;
    55         }
    56 
    57         for(int i = 1; i <= m; i++)
    58         {
    59             memset(vis, 0, sizeof(vis));     //每次询问之前都要清0,在一次询问中,每个都是未被访问过的。
    60             if(found(i))
    61                 ans++;
    62         }
    63         printf("%d
    ", ans);
    64     }
    65     return 0;
    66 }

    让未来到来 让过去过去
  • 相关阅读:
    [LeetCode] Bulb Switcher II 灯泡开关之二
    [LeetCode] Second Minimum Node In a Binary Tree 二叉树中第二小的结点
    [LeetCode] 670. Maximum Swap 最大置换
    [LeetCode] Trim a Binary Search Tree 修剪一棵二叉搜索树
    [LeetCode] Beautiful Arrangement II 优美排列之二
    [LeetCode] Path Sum IV 二叉树的路径和之四
    [LeetCode] Non-decreasing Array 非递减数列
    [LeetCode] 663. Equal Tree Partition 划分等价树
    [LeetCode] 662. Maximum Width of Binary Tree 二叉树的最大宽度
    [LeetCode] Image Smoother 图片平滑器
  • 原文地址:https://www.cnblogs.com/Tinamei/p/4718739.html
Copyright © 2011-2022 走看看