POJ1274 The Perfect Stall 二分图,匈牙利算法

N头牛,M个畜栏,每头牛只喜欢其中的某几个畜栏,但是一个畜栏只能有一只牛拥有,问最多可以有多少只牛拥有畜栏。

典型的指派型问题,用二分图匹配来做,求最大二分图匹配可以用最大流算法,也可以用匈牙利算法,这里使用匈牙利算法。

#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <math.h>
#include <string.h>
#include <string>
#include <iostream>
#include <queue>
#include <list>
#include <algorithm>
#include <stack>
#include <map>

#include<iostream>
#include<cstdio>
using namespace std;

#define	MAXN	401

bool Visited[MAXN];
int Result[MAXN];
int G[MAXN][MAXN];

bool dfs(int s, int n, int m)
{

	for (int i = n + 1; i <= n + m;i++)
	{
		if (G[s][i] && Visited[i] == false)
		{
			Visited[i] = true;
			if (Result[i] == 0 ||dfs(Result[i], n, m))
			{
				Result[i] = s;
				return true;
			}
		}
	}
	return false;
}

int main()
{
#ifdef _DEBUG
	freopen("d:\\in.txt", "r", stdin);
#endif
	int n, m;
	while (scanf("%d %d", &n, &m) != EOF)
	{
		memset(G, 0, sizeof(G));
		memset(Result, 0, sizeof(Result));
		for (int i = 1; i <= n;i++)
		{
			int k;
			scanf("%d", &k);
			for (int j = 0; j < k; j++)
			{
				int d;
				scanf("%d", &d);
				G[i][n + d] = 1;
			}

		}
		int max = 0;
		for (int s = 1; s <= n; s++)
		{
			memset(Visited, 0, sizeof(Visited));
			if (dfs(s, n, m))
			{
				max++;
			}

		}
		printf("%d\n", max);
	}
	return 0;
}

POJ1274 The Perfect Stall 二分图,匈牙利算法

时间: 2024-10-07 04:17:31

POJ1274 The Perfect Stall 二分图,匈牙利算法的相关文章

poj 1274 The Perfect Stall【匈牙利算法模板题】

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

POJ1274 The Perfect Stall【二分图最大匹配】

题目链接: http://poj.org/problem?id=1274 题目大意: 有N头奶牛(编号1~N)和M个牛棚(编号1~M).每头牛只可产一次奶,每个牛棚也只允许一只牛产奶. 现在给出每头奶牛喜欢去的牛棚的编号.问:最多有多少头奶牛能完成产奶. 思路: 二分图最大匹配问题,建立一个图,用行来表示奶牛,用列来表示牛棚.将奶牛和喜欢去的牛棚编号 连边.然后用匈牙利算法DFS版或BFS版求二分图的最大匹配数即可.这里用了匈牙利算法DFS版. AC代码: #include<iostream>

POJ1274 The Perfect Stall

Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u 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

hiho1122_二分图匈牙利算法

题目 给定一个图的N个节点和节点之间的M条边,数据保证该图可以构成一个二分图.求该二分图最大匹配. 题目链接:二分图最大匹配     首先通过染色法,将图的N个节点分成两个部分:然后通过匈牙利算法求二分图的最大匹配. 实现 #include<stdio.h> #include<string.h> #include<iostream> #include<string> #include<set> #include<map> #inclu

POJ 3020 Antenna Placement(二分图 匈牙利算法)

题目网址:  http://poj.org/problem?id=3020 题意: 用椭圆形去覆盖给出所有环(即图上的小圆点),有两种类型的椭圆形,左右朝向和上下朝向的,一个椭圆形最多可以覆盖相邻的两个小圆点.   思路: 将每个小圆点看作是一个顶点,因为一个椭圆只能覆盖两个小圆点,我们就可以把这个图看成一个二分图.将相邻的两个点,一个看作是X集合内顶点,另一个看成是Y集合内顶点.但要注意的是一个顶点可能不止和一个顶点想连(如上图情况),所以我们要把上述情况看作是一个无向图,而不是有向图.无向图

POJ_1274_The Perfect Stall(二分图匹配)

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

二分图 匈牙利算法

匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. -------等等,看得头大?那么请看下面的版本: 通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可能对多名异性有好感(-_-||暂时不考虑特殊的性取向),如果一对男女互有好感,那么你就可以把这一对撮合在一起,现在

POJ 1274-The Perfect Stall(二分图_最大匹配)

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

二分图&amp;&amp;匈牙利算法(二分图基本算法)

二分图 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 区别二分图,关键是看点集是否能分成两个独立的点集.如下图所示 二分图的最大匹配 给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个匹配. 选择这样的边数最大的子集称为图的最大匹配问题(maxim