• cogs 886. [USACO 4.2] 完美的牛栏 二分图 匈牙利算法


    886. [USACO 4.2] 完美的牛栏

    ★★☆   输入文件:stall4.in   输出文件:stall4.out   简单对比
    时间限制:1 s   内存限制:128 MB

    USACO/stall4(译by Felicia Crazy)

    描述

    农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术。不幸的是,由于工程问题,每个牛栏都不一样。第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶。上个星期,农夫约翰刚刚收集到了奶牛们的爱好的信息(每头奶牛喜欢在哪些牛栏产奶)。一个牛栏只能容纳一头奶牛,当然,一头奶牛只能在一个牛栏中产奶。

    给出奶牛们的爱好的信息,计算最大分配方案。

    格式

    PROGRAM NAME: stall4

    INPUT FORMAT:

    (file stall4.in)

    第一行 两个整数,N (0 <= N <= 200)和M (0 <= M <= 200)。N是农夫约翰的奶牛数量,M是新牛棚的牛栏数量。
    第二行到第N+1行

    一共N行,每行对应一只奶牛。第一个数字(Si)是这头奶牛愿意在其中产奶的牛栏的数目(0 <= Si<= M)。后面的Si个数表示这些牛栏的编号。牛栏的编号限定在区间(1..M)中,在同一行,一个牛栏不会被列出两次。

    OUTPUT FORMAT:

    (file stall4.out)

     只有一行。输出一个整数,表示最多能分配到的牛栏的数量。

    SAMPLE INPUT (file stall4.in)

    5 5

    2 2 5

    3 2 3 4

    2 1 5

    3 1 2 5

    1 2

    SAMPLE OUTPUT (file stall4.out)

    4

    啊哈!又看到一道水题(水题的简单定义为:自己会做的题)

    这一道题其实就是一个匈牙利算法 求最大匹配啊快速水一水就是二分图

    一边是奶牛 一边是牛棚 如果奶牛喜欢就连一条边 求最大匹配

    瞎跑一跑就过了QAQ突然忘记匈牙利算法咋写的我

    这次代码犯了3个低级错误(----------警戒线----------)

    1.maxn我居然傻傻地定义为200  不应该205吗QAQ 瞬间RE2个点

    2.匈牙利算法建边只需要建单项边就行了 从左连往右

    3.太蒟了  我为什么两层for循环的时候老是都用i  把j给遗忘了QWQ代码如下

    #include<bits/stdc++.h>
    #define maxn 205
    using namespace std;
    int n,m;
    int tim,vis[maxn],hav[maxn];
    vector<int> v[maxn];
    bool Dfs(int x)
    {
        for(int i=0;i<v[x].size();i++)
        {
            int y=v[x][i];
            if(vis[y]!=tim)
            {
                vis[y]=tim;
                if(!hav[y]||Dfs(hav[y]))
                {
                    hav[y]=x;
                    return true;
                }
            }
        }
        return false;
    }
    int main()
    {
        freopen("stall4.in","r",stdin);
        freopen("stall4.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            int s;
            scanf("%d",&s);
            for(int j=1;j<=s;j++)
            {
                int x;
                scanf("%d",&x);
                v[i].push_back(x);
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            tim++;
            ans+=Dfs(i);
        }
        printf("%d",ans);
        return 0;
    } 

     多练练就好啦 ♪(^∇^*)

  • 相关阅读:
    转载 自定义ListView背景
    Android 在模拟器上创建sd卡
    转载 Android TextView加下划线
    转载 Dom4j生成xml
    转载 在Struts2中使用servlet 配置问题
    android开发不错的地方
    bat demo1自定义变量
    redhat 5下安装SVN
    linux 忘记root密码
    DEBUG Sigar no libsigarx86linux.so in java.library.path
  • 原文地址:https://www.cnblogs.com/Tidoblogs/p/11333290.html
Copyright © 2020-2023  润新知