题意:

FJ准备了F种食物和D种饮料,每头牛都有喜欢的食物和饮料,并且每头牛都只能分配一种食物和饮料。问如何分配使得同时得到喜欢的食物和饮料的牛数量最多。

分析:

首先想到将牛与其对应的食物和饮料匹配起来,即在食物、饮料与牛之间连一条边,再在s和所有食物之间、t和所有饮料之间连一条边。这样每一条路径都对应着食物饮料和牛之间的匹配方案。那么如何避免一头牛被分配多组匹配呢?就将一头牛拆成两个结点,并用一条容量为1的边连接起来,这样求出构成的图中的最大流,即得解。这里使用的是Dinic算法。

代码:

#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
struct edge{int to, cap, rev;};
const int maxn = 105, maxm = 2000055, INF = 0x3fffffff;
int d[maxm], iter[maxm];
int s, t;
vector<edge>G[maxm];
int dr[maxn][maxn], f[maxn][maxn];
void add_edge(int from, int to, int cap)
{G[from].push_back((edge){to, cap, G[to].size()});G[to].push_back((edge){from, 0, G[from].size()-1});
}
void bfs()
{memset(d, -1, sizeof(d));queue<int>q;d[s] = 0;q.push(s);while(!q.empty()){int v = q.front();q.pop();for(int i = 0; i <G[v].size(); i++){edge &e = G[v][i];if(e.cap>0&&d[e.to]<0){d[e.to] = d[v] + 1;q.push(e.to);}}}
}
int dfs(int v, int f)
{if(v==t) return f;for(int &i = iter[v]; i < G[v].size(); i++){edge &e = G[v][i];if(e.cap > 0 && d[v] < d[e.to]){int tf = dfs(e.to, min(f, e.cap));if(tf > 0){e.cap -= tf;G[e.to][e.rev].cap +=tf;return tf;}}}return 0;
}
int max_flow()
{int flow = 0;for(;;){bfs();if(d[t]<0) return flow;memset(iter, 0, sizeof(iter));int f;while((f = dfs(s, INF))>0){flow += f;}}
}
int main (void)
{int N, F, D;scanf("%d%d%d",&N, &F, &D);int a, b;s = 2 * N + F + D + 1, t = s + 1;for(int i = 1; i <= N; i++){scanf("%d%d",&a, &b);add_edge(i, N + i, 1);for(int j = 0; j < a; j++){scanf("%d",&f[i][j]);add_edge(2 * N + f[i][j], i, 1);}for(int j = 0; j < b; j++){scanf("%d",&dr[i][j]);add_edge(N + i, 2 * N + F + dr[i][j], 1);}}for(int i = 1; i <= F; i++)add_edge(s, 2 * N + i, 1);for(int i = 1; i <= D; i++)add_edge(2 * N + F + i, t, 1);printf("%d\n",max_flow());
}

增广路径必须满足的性质
1.有奇数条边。
2.起点在二分图的左半边,终点在右半边。
3.路径上的点一定是一个在左半边,一个在右半边,交替出现。(其实二分图的性质就决定了这一点,因为二分图同一边的点之间没有边相连,不要忘记哦。)
4.整条路径上没有重复的点。
5.起点和终点都是目前还没有配对的点,而其它所有点都是已经配好对的。
6.路径上的所有第奇数条边都不在原匹配中,所有第偶数条边都出现在原匹配中。
7.最后,也是最重要的一条,把增广路径上的所有第奇数条边加入到原匹配中去,并把增广路径中的所有第偶数条边从原匹配中删除(这个操作称为增广路径的取反),则新的匹配数就比原匹配数增加了1个(奇数=偶数+1)。

转载于:https://www.cnblogs.com/Tuesdayzz/p/5758773.html

POJ 3281_Dining相关推荐

  1. POJ 3268 D-Silver Cow Party

    http://poj.org/problem?id=3268 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  2. poj 2559 Largest Rectangle in a Histogram 栈

    // poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...

  3. POJ 2528 Mayor's posters(线段树)

    题目大意 贴海报.每张海报的高度都是一样的,唯独宽度不一样.每张海报只能占用整数倍的单位线段长度,贴了 n(n<=10000) 张海报之后,有几张能够看见(有一个角能看见这张海报也算被看见了)? ...

  4. POJ 2226 Muddy Fields 最小点覆盖+加建图(好题)

    题目链接 题目一看就是最小点覆盖,这道题与POJ - 3041 算是一类题,但是3041算是一道十分裸的,因为删除的是整行或者整列,所以图其实是现成的,但是本题的难点就在如何建图. 思路:首先还是尽量 ...

  5. poj 2681 字符串

    http://poj.org/problem?id=2681 给你任意长度的字符串,找出两串字符中不相同的字符个数(总数) #include<string> #include<cst ...

  6. (区间dp 或 记忆化搜素 )Brackets -- POJ -- 2955

    http://poj.org/problem?id=2955 Description We give the following inductive definition of a "reg ...

  7. POJ 2586 Y2K Accounting Bug(贪心)

    题目连接:http://poj.org/problem?id=2586 题意:某公司要统计全年盈利状况,对于每一个月来说,如果盈利则盈利S,如果亏空则亏空D.公司每五个月进行一次统计,全年共统计8次( ...

  8. poj 2362 Square

    #include <iostream> //参照poj 1011 sticks#include <algorithm>using namespace std;int stick ...

  9. 图论之拓扑排序 poj 2367 Genealogical tree

    题目链接 http://poj.org/problem?id=2367 题意就是给定一系列关系,按这些关系拓扑排序. #include<cstdio> #include<cstrin ...

最新文章

  1. 远程访问mysql设置
  2. Apollo仿真「训练有素」,长沙无人驾驶出租「轻车熟路」
  3. Delphi的StringReplace[转]
  4. Java 运行时数据区域
  5. MongoDB服务无法启动,原因居然是...
  6. ae插件Particle Projection for Mac(AE粒子投影插件)
  7. C++ 用new 动态创建多维数组
  8. ansible安装和基本使用
  9. 数据科学导论_数据科学导论,数据理解和准备
  10. c语言数据类型简介表格,C语言基本数据类型简介.docx
  11. AS3.0文档类:FLASH右键菜单文档类
  12. Android10动态权限提前,Unity2019中的android动态申请权限(Permissions)
  13. 没有实际的工作经验,如何面试Linux运维工程师?
  14. 博弈论分析题_博弈论习题及参考答案
  15. caffe教程笔记《Solver》
  16. 关于设计BOM和制造BOM的介绍
  17. 秃鹫入门4,GDB调试与OpenCV图像库
  18. 从C到C++衔接——浅析两种语言的差别
  19. 计算机互联网职业高中排名,职业高中有哪些热门专业可选择
  20. 棋圣高调搬弄名人日本棋圣挟五冠搬弄对手

热门文章

  1. CTFshow php特性 web138
  2. deconv--反褶积和多项式除法
  3. Python 基础语法(一)
  4. HDF5数据处理(一)python
  5. python写背单词软件_python背单词小程序
  6. Unity Shader 屏幕后效果——高斯模糊
  7. 在Python中使用SMTP发送电子邮件
  8. 【oracle】补充 cursor 基本例子
  9. df 和 du 命令详解
  10. puppet 工作原理