Poj(1274),二分图匹配

题目链接:http://poj.org/problem?id=1274

The Perfect Stall

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 23088   Accepted: 10285

Description

Farmer John completed his new barn just last week, complete with all the latest milking technology. Unfortunately, due to engineering problems, all the stalls in the new barn are different. For the first week, Farmer John randomly assigned cows to stalls, but it quickly became clear that any given cow was only willing to produce milk in certain stalls. For the last week, Farmer John has been collecting data on which cows are willing to produce milk in which stalls. A stall may be only assigned to one cow, and, of course, a cow may be only assigned to one stall.
Given the preferences of the cows, compute the maximum number of milk-producing assignments of cows to stalls that is possible.

Input

The
input includes several cases. For each case, the first line contains two
integers, N (0 <= N <= 200) and M (0 <= M <= 200). N is the
number of cows that Farmer John has and M is the number of stalls in
the new barn. Each of the following N lines corresponds to a single cow.
The first integer (Si) on the line is the number of stalls that the cow
is willing to produce milk in (0 <= Si <= M). The subsequent Si
integers on that line are the stalls in which that cow is willing to
produce milk. The stall numbers will be integers in the range (1..M),
and no stall will be listed twice for a given cow.

Output

For
each case, output a single line with a single integer, the maximum
number of milk-producing stall assignments that can be made.

Sample Input

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

Sample Output

4

Source

USACO 40

题意:

有n个奶牛和m个谷仓,现在每个奶牛有自己喜欢去的谷仓,并且它们只会去自己喜欢的谷仓吃东西,问最多有多少奶牛能够吃到东西

输入第一行给出n与m
接着n行
每行第一个数代表这个奶牛喜欢的谷仓的个数P,后面接着P个数代表这个奶牛喜欢哪个谷仓

分析: 最大匹配,用匈牙利即可。

#include <stdio.h>
#include <string.h>

bool maps[205][205];
bool use[205];
int match[205];
int n,m;

bool DFS(int u)
{
    for(int i=1;i<=m;i++)
    {
        if(!use[i]&&maps[u][i])
        {
            use[i] = true;
            if(match[i]==-1||DFS(match[i]))
            {
                match[i] = u;
                return true;
            }
        }
    }
    return false;
}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(match,-1,sizeof(match));
        memset(maps,false,sizeof(maps));
        for(int i=1;i<=n;i++)
        {
            int num;
            scanf("%d",&num);
            for(int j=1;j<=num;j++)
            {
                int v;
                scanf("%d",&v);
                maps[i][v] = true;
            }
        }

        int num = 0;
        for(int i=1;i<=n;i++)
        {
            memset(use,false,sizeof(use));
            if(DFS(i))
                num++;
        }
        printf("%d\n",num);

    }
    return 0;
}
时间: 2024-10-10 10:16:33

Poj(1274),二分图匹配的相关文章

POJ 2446 二分图匹配

题意:给你一个n*m方格 让你用1*2的的小方格去铺满,其中有k个方格不能被铺到. 思路:二分图建图, 以每个格子为点建图,如果可以用一块1*2的小方格铺到,就连一条边. 每个格子在X集合和Y集合都有一个点,只要任意一边被匹配到了就算可以,然后就是二分图匹配了. 上代码. #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector

POJ 1325 二分图匹配/匈牙利算法

Machine Schedule Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11922 Accepted: 5077 Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduling p

poj 1325(二分图匹配)

题意:有两台机器有各有n和m种模式(都是从0开始编号),有k个任务,每个任务可以是第一台机器的x模式或第二台机器的y模式,每台机器切换模式都要重启(重启后初始模式是0),问最少次数重启使所有任务完成. 题解:把任务当做边,两台机器的模式放在不同集合中,那么就是二分图的最小点集覆盖问题,注意模式0可以不计算,因为重启初始模式就是0,不需要花费重启次数. #include <stdio.h> #include <string.h> const int N = 105; int n, m

POJ 3041 -- 二分图匹配

题意:有个N*N的网格,有一部分格子里有陨石,小明有很牛逼的武器,打一枪后一行或一列的陨石就没了,给出陨石分布,求最小打炮数. 分析:其实就是Konig定理.记最小打炮数为m,在网格里你最多可以找出M个互相之间既不在同一行又不在同一列的元素,也就是说你再找一个元素它必定与已有的某个元素同行或同列,Konig定理就是:m = M.至于具体打时是打某一行还是某一列,要看剩下的元素与现有元素共行或共列的情况了. 那么问题就转化成找出这M个陨石,把行和列看做一个二分图,那么找M就是找最大匹配了. 和PO

POJ 2239 二分图匹配/Hungary

Selecting Courses Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8667 Accepted: 3863 Description It is well known that it is not easy to select courses in the college, for there is usually conflict among the time of the courses. Li Ming i

Antenna Placement POJ - 3020 二分图匹配 匈牙利 拆点建图 最小路径覆盖

题意:图没什么用  给出一个地图 地图上有 点 一次可以覆盖2个连续 的点( 左右 或者 上下表示连续)问最少几条边可以使得每个点都被覆盖 最小路径覆盖       最小路径覆盖=|G|-最大匹配数                   证明:https://blog.csdn.net/qq_34564984/article/details/52778763 证明总的来说就是尽可能多得连边 边越多 可以打包一起处理得点就越多(这里题中打包指连续得两个点只需要一条线段就能覆盖) 拆点思想   :匈牙

poj 2239(二分图匹配)

题意:有n门课,每门课都有一些上课时间,周几的第几节课,一个人想报尽量多的课但时间不能冲突,问最多能报多少门课. 题解:只需要把课程当做一个集合,上课时间当做另一个集合,然后把每个课程和它的上课时间(时间可以用(p - 1) * 12 + p表示)都加一条边到图里,找最大匹配数让每个课程至少对应一个上课时间. #include <stdio.h> #include <string.h> #include <vector> using namespace std; con

POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)

The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24081   Accepted: 10695 Description Farmer John completed his new barn just last week, complete with all the latest milking technology. Unfortunately, due to engineering p

二分图最大匹配题目汇总 POJ 1274、2239、3020、3715

POJ 1274 #include <iostream> #include <string.h> #include <vector> #include <cstdio> using namespace std; vector<int> aa[205]; int flag[205],visted[205]; bool dfs(int x){ for(int i=0;i<aa[x].size();++i){ if(!visted[aa[x][i

poj 1274 The Perfect Stall (二分匹配)

The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17768   Accepted: 8104 Description Farmer John completed his new barn just last week, complete with all the latest milking technology. Unfortunately, due to engineering pr