洛谷 P1894 [USACO4.2]完美的牛栏The Perfect Stall

P1894 [USACO4.2]完美的牛栏The Perfect Stall

题目描述

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

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

输入输出格式

输入格式:

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

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

输出格式:

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

输入输出样例

输入样例#1: 复制

5 5
2 2 5
3 2 3 4
2 1 5
3 1 2 5
1 2

输出样例#1: 复制

4

说明

N (0 <= N <= 200)

M (0 <= M <= 200)

思路:网络流或者是匈牙利都可以搞过去,一个裸的板子题。

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 40010
using namespace std;
int n,m,tot=1;
int ans,src,decc;
int lev[MAXN],cur[MAXN];
int to[MAXN*2],cap[MAXN*2],net[MAXN*2],head[MAXN];
void add(int u,int v,int w){
    to[++tot]=v;cap[tot]=w;net[tot]=head[u];head[u]=tot;
    to[++tot]=u;cap[tot]=0;net[tot]=head[v];head[v]=tot;
}
bool bfs(){
    queue<int>que;
    for(int i=src;i<=decc;i++){
        lev[i]=-1;
        cur[i]=head[i];
    }
    que.push(src);lev[src]=0;
    while(!que.empty()){
        int now=que.front();
        que.pop();
        for(int i=head[now];i;i=net[i]){
            if(lev[to[i]]==-1&&cap[i]>0){
                lev[to[i]]=lev[now]+1;
                que.push(to[i]);
                if(to[i]==decc)    return true;
            }
        }
    }
    return false;
}
int dinic(int now,int flow){
    if(now==decc)    return flow;
    int rest=0,detal;
    for(int & i=cur[now];i;i=net[i])
        if(cap[i]>0&&lev[to[i]]==lev[now]+1){
            detal=dinic(to[i],min(flow-rest,cap[i]));
            if(detal){
                rest+=detal;
                cap[i]-=detal;
                cap[i^1]+=detal;
                if(rest==flow)    break;
            }
        }
    if(rest!=flow)    lev[now]=-1;
    return rest;
}
int main(){
    scanf("%d%d",&n,&m);
    src=0;decc=n+m+1;
    for(int i=1;i<=n;i++)    add(src,i,1);
    for(int i=1;i<=m;i++)    add(n+i,decc,1);
    for(int i=1;i<=n;i++){
        int k;scanf("%d",&k);
        for(int j=1;j<=k;j++){
            int x;scanf("%d",&x);
            add(i,x+n,1);
        }
    }
    while(bfs())
        ans+=dinic(src,0x7f7f7f7f);
    cout<<ans;
}

原文地址:https://www.cnblogs.com/cangT-Tlan/p/8227426.html

时间: 2024-08-24 09:58:52

洛谷 P1894 [USACO4.2]完美的牛栏The Perfect Stall的相关文章

洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall

P1894 [USACO4.2]完美的牛栏The Perfect Stall 题目描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶.上个星期,农夫约翰刚刚收集到了奶牛们的爱好的信息(每头奶牛喜欢在哪些牛栏产奶).一个牛栏只能容纳一头奶牛,当然,一头奶牛只能在一个牛栏中产奶. 给出奶牛们的爱好的信息,计算最大分配方案. 输入输出

洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall(二分图)

P1894 [USACO4.2]完美的牛栏The Perfect Stall 题目描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶.上个星期,农夫约翰刚刚收集到了奶牛们的爱好的信息(每头奶牛喜欢在哪些牛栏产奶).一个牛栏只能容纳一头奶牛,当然,一头奶牛只能在一个牛栏中产奶. 给出奶牛们的爱好的信息,计算最大分配方案. 输入输出

洛谷 1894 [USACO4.2]完美的牛栏The Perfect Stall

[题解] 其实是个二分图最大匹配的模板题,直接上匈牙利算法就好了. 1 #include<cstdio> 2 #include<algorithm> 3 #define N 1010 4 #define rg register 5 using namespace std; 6 int n,m,E,ans,T,tot,last[N],v[N],from[N]; 7 struct edge{ 8 int to,pre; 9 }e[N*N]; 10 inline int read(){

P1894 [USACO4.2]完美的牛栏The Perfect Stall

题目描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶.上个星期,农夫约翰刚刚收集到了奶牛们的爱好的信息(每头奶牛喜欢在哪些牛栏产奶).一个牛栏只能容纳一头奶牛,当然,一头奶牛只能在一个牛栏中产奶. 给出奶牛们的爱好的信息,计算最大分配方案. 输入输出格式 输入格式: 第一行 两个整数,N (0 <= N <= 200) 和

[USACO4.2]完美的牛栏The Perfect Stall

题目:USACO Training 4.2(在官网上提交需加文件输入输出).洛谷P1894. 题目大意:有n头奶牛m个牛栏,每头牛只会在自己喜欢的牛栏里产奶,问一次最多有多少奶牛能产奶. 解题思路:二分图匹配.这里我用了网络流,先建立超级源点和超级汇点,跑最大流即可.以下是Dinic算法的代码. C++ Code: #include<cstdio> #include<queue> #include<cstring> #include<algorithm> #

题解 P1894 【[USACO4.2]完美的牛栏The Perfect Stall】

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

洛谷P2738 [USACO4.1]篱笆回路Fence Loops

P2738 [USACO4.1]篱笆回路Fence Loops 11通过 21提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 农夫布朗的牧场上的篱笆已经失去控制了.它们分成了1~200英尺长的线段.只有在线段的端点处才能连接两个线段,有时给定的一个端点上会有两个以上的篱笆.结果篱笆形成了一张网分割了布朗的牧场.布朗想将牧场恢复原样,出于这个考虑,他首先得知道牧场上哪一块区域的周长最小. 布朗将他的每段篱笆从1到N进行了标号

洛谷P2751 [USACO4.2]工序安排Job Processing

P2751 [USACO4.2]工序安排Job Processing 18通过 78提交 题目提供者该用户不存在 标签 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 一家工厂的流水线正在生产一种产品,这需要两种操作:操作A和操作B.每个操作只有一些机器能够完成. Ioi96d1.gif 上图显示了按照下述方式工作的流水线的组织形式.A型机器从输入库接受工件,对其施加操作A,得到的中间产品存放在缓冲库.B型机器从缓冲库接受中间产品,对其施加操作B,得到的最终产品存放在输

洛谷 P2738 [USACO4.1]篱笆回路Fence Loops

P2738 [USACO4.1]篱笆回路Fence Loops 题目描述 农夫布朗的牧场上的篱笆已经失去控制了.它们分成了1~200英尺长的线段.只有在线段的端点处才能连接两个线段,有时给定的一个端点上会有两个以上的篱笆.结果篱笆形成了一张网分割了布朗的牧场.布朗想将牧场恢复原样,出于这个考虑,他首先得知道牧场上哪一块区域的周长最小. 布朗将他的每段篱笆从1到N进行了标号(N=线段的总数).他知道每段篱笆有如下属性: 该段篱笆的长度 该段篱笆的一端所连接的另一段篱笆的标号 该段篱笆的另一端所连接