奶牛的午餐
来源:互联网 发布:数据库系统简明教程 编辑:程序博客网 时间:2024/04/28 23:47
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others.
Farmer John has cooked fabulous meals for his cows, but he forgot to check his menu against their preferences. Although he might not be able to stuff everybody, he wants to give a complete meal of both food and drink to as many cows as possible.
Farmer John has cooked F (1 ≤ F ≤ 100) types of foods and prepared D (1 ≤ D ≤ 100) types of drinks. Each of his N (1 ≤ N ≤ 100) cows has decided whether she is willing to eat a particular food or drink a particular drink. Farmer John must assign a food type and a drink type to each cow to maximize the number of cows who get both.
Each dish or drink can only be consumed by one cow (i.e., once food type 2 is assigned to a cow, no other cow can be assigned food type 2).
输入:
Line 1: Three space-separated integers: N, F, and D
Lines 2..N+1: Each line i starts with a two integers Fi and Di, the number of dishes that cow i likes and the number of drinks that cow i likes. The next Fi integers denote the dishes that cow i will eat, and the Di integers following that denote the drinks that cow i will drink.
输出:
Line 1: A single integer that is the maximum number of cows that can be fed both food and drink that conform to their wishes
输入样例:
4 3 3
2 2 1 2 3 1
2 2 2 3 1 2
2 2 1 3 1 2
2 1 1 3 3
输出样例:
3
提示:
One way to satisfy three cows is:
Cow 1: no meal
Cow 2: Food #2, Drink #2
Cow 3: Food #1, Drink #1
Cow 4: Food #3, Drink #3
The pigeon-hole principle tells us we can do no better since there are only three kinds of food or drink. Other test data sets are more challenging, of course.
#include <iostream>#include <string>#include <queue>#define INF 1<<16#define MAX_NUM 405using namespace std;int cow, food, drink, total;int pre_point[MAX_NUM], flow[MAX_NUM][MAX_NUM], capacity[MAX_NUM][MAX_NUM], flow_add[MAX_NUM];int GetSmaller(int &a, int &b){return (a < b)? a : b;}void BFS(void){queue<int> points;memset(flow_add, 0x00, sizeof(flow_add));flow_add[0] = INF;points.push(0);while (!points.empty()){int start = points.front();points.pop();for (int end = 1; end < total; ++end){int differ = capacity[start][end] - flow[start][end];if (!flow_add[end] && differ > 0){points.push(end);pre_point[end] = start;flow_add[end] = GetSmaller(flow_add[start], differ);}}}}int MaxFlow(int start, int end){int max = 0;memset(flow, 0x00, sizeof(flow));//Initialize zero_flowwhile (true){BFS();//one time flow_add operationif (!flow_add[total - 1])break;else{for (int end = total - 1; end != start; end = pre_point[end]){//renew the flow conditionflow[pre_point[end]][end] += flow_add[total - 1];flow[end][pre_point[end]] -= flow_add[total - 1];}}max += flow_add[total - 1];}return max;}int main(void){int i, j, food_like, drink_like, like;memset(capacity, 0x00, sizeof(capacity));cin >> cow >> food >> drink;total = food + drink + cow * 2 + 2;for (i = 1; i <= food; ++i)capacity[0][i] = 1;for (i = 1; i <= drink; ++i)capacity[food + cow * 2 + i][total - 1] = 1;for (i = 1; i <= cow; ++i){cin >> food_like >> drink_like;for (j = 1; j <= food_like; ++j){cin >> like;capacity[like][i + food] = 1;}for (j = 1; j <= drink_like; ++j){cin >> like;capacity[food + cow + i][food + cow * 2 + like] = 1;}capacity[food + i][food + cow + i] = 1;}cout << MaxFlow(0, total) << endl;return 0;}
- 奶牛的午餐
- 小资的午餐
- Google的免费午餐
- 免费的午餐
- 悲剧的午餐
- Xbox用户的免费午餐
- 天下没有免费的午餐
- 边远山区的免费午餐
- 世上没有免费的午餐
- 白领的一天:商务午餐
- 没有午餐吃的小学
- 天下没有白费的午餐
- 天下没有免费的午餐
- 天下没有免费的午餐
- 天下没有免费的午餐
- 天下没有免费的午餐
- 没有免费的午餐定理
- 天下没有免费的午餐
- 乔布斯
- USACO 第一章总结
- hibernate中java.util.Date类型映射
- Linux Event Logging
- VS2008中添加程序启动画面 splash screen
- 奶牛的午餐
- 网页设计要学什么
- C++文件操作详解(ifstream、ofstream、fstream)
- 网页设计的学习内容
- Tomcat配置JDBC数据库连接池
- 指针作为函数参数
- python+正则表达式
- 机器视觉的几个典型应用场合
- 先锋人物乔大哥挂了