网络流之P3254 圆桌问题
题目描述
假设有来自m 个不同单位的代表参加一次国际会议。每个单位的代表数分别为ri (i =1,2,……,m)。
会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,……,n)个代表就餐。
为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。试设计一个算法,给出满足要求的代表就餐方案。
对于给定的代表数和餐桌数以及餐桌容量,编程计算满足要求的代表就餐方案。
输入输出格式
输入格式:
第1 行有2 个正整数m 和n,m 表示单位数,n 表示餐桌数,1<=m<=150, 1<=n<=270。
第2 行有m 个正整数,分别表示每个单位的代表数。
第3 行有n 个正整数,分别表示每个餐桌的容量。
输出格式:
如果问题有解,第1 行输出1,否则输出0。接下来的m 行给出每个单位代表的就餐桌号。如果有多个满足要求的方案,只要输出1 个方案。
输入输出样例
4 5 4 5 3 5 3 5 2 6 4
1 1 2 4 5 1 2 3 4 5 2 4 5 1 2 3 4 5
圆桌问题
网络流,是一个匹配问题。
可以把求一个人员的分配,转化成一个网络流问题
转化:
这个题目是要求所有的人都可以合理的分配到每一个桌子,这个所谓的合理就是一个单位的不许坐在一起。
所以就建一个图,把每一个单位都和所有的桌子连一条权值为1的线,意思是这个单位只能分配一个人到这里。
然后每一个单位到源点连一根线这根线权值是这个单位的人,然后就是每一个桌子连一根线到汇点,线的权值就是桌子能做的人。
这就是建图,然后你会发现,如果我们要合理分配,那么就是从源点到汇点的最大流为所有单位人之和。
也就是源点连的每一条线的边权值。
建图之后就是一个dinic的板子。
然后就是一个一个路径的输出,这个路径的输出很简单,就是判断这条边(就是单位到桌子)的负边的权值是不是-1,
如果是,则说明这个单位有一个人坐在这里。
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> #include <cmath> #include <iostream> #include <vector> #define inf 0x3f3f3f3f using namespace std; const int maxn = 1e5 + 10; int s, t, n, m; struct node {int from, to, cap, flow;node(int from=0,int to=0,int cap=0,int flow=0):from(from),to(to),cap(cap),flow(flow){} }; vector<node>e; vector<int>G[maxn]; int level[maxn], iter[maxn], head[maxn]; void add(int u,int v,int c) {e.push_back(node(u, v, c, 0));e.push_back(node(v, u, 0, 0));int len = e.size();G[u].push_back(len - 2);G[v].push_back(len - 1); }void bfs(int s) {memset(level, -1, sizeof(level));queue<int>que;que.push(s);level[s] = 0;while(!que.empty()){int u = que.front(); que.pop();for(int i=0;i<G[u].size();i++){node &now = e[G[u][i]];if(level[now.to]<0&&now.cap>now.flow){level[now.to] = level[u] + 1;que.push(now.to);}}} }int dfs(int u,int v,int f) {if (u == v) return f;for(int &i=iter[u];i<G[u].size();i++){node &now = e[G[u][i]];if(now.cap>now.flow&&level[now.to]>level[u]){int d = dfs(now.to, v, min(f, now.cap - now.flow));if(d>0){now.flow += d;e[G[u][i] ^ 1].flow -= d;return d;}}}return 0; } int sum = 0; bool dinic() {int flow = 0;while(1){bfs(s);if (level[t] < 0) return flow==sum;memset(iter, 0, sizeof(iter));int f;while ((f = dfs(s, t, inf)) > 0) flow += f;} } vector<int>to[maxn]; int main() {cin >> m >> n;s = 0, t = m + n + 1;for(int i=1;i<=m;i++){int x;cin >> x;sum += x;add(s, i, x);}for(int i=1;i<=n;i++){int x;cin >> x;add(i + m, t, x);}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){add(i, j + m, 1);}}int ans = dinic();printf("%d\n", ans);if(ans)for(int i=1;i<=m;i++){for(int j=0;j<G[i].size();j++){node now = e[G[i][j] ^ 1];if (now.flow == -1) printf("%d ", e[G[i][j]].to-m);}printf("\n");}return 0; }
转载于:https://www.cnblogs.com/EchoZQN/p/10741451.html
网络流之P3254 圆桌问题相关推荐
- 洛谷 P3254 圆桌问题
PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P3254 圆桌问题 题目 题目描述 有来自 m m m 个不同单位的代表参加一次国际会议.第 i i i 个单位派出了 r i r_ ...
- P3254 圆桌问题
P3254 圆桌问题 题目描述 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为\(ri (i =1,2,--,m)\). 会议餐厅共有\(n\)张餐桌,每张餐桌可容纳\(ci ...
- 网络流24题 圆桌聚餐
原题位置: http://cogs.sxysxy.org:8080/cogs/problem/problem.php?pid=729 (这个有SPJ) 这个题是一个裸的网络流板子题,都说网络流难在建图 ...
- [网络流24题]圆桌聚餐
网络流大法好!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ...
- COGS 729 [网络流24题] 圆桌聚餐
«问题描述: 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri(i=1,2,3...m), .会议餐厅共有n张餐桌,每张餐桌可容纳c i(i=1,2...n) 个代表就餐. ...
- 洛谷P3254 圆桌问题(最大流)
题意 $m$个不同单位代表参加会议,第$i$个单位有$r_i$个人 $n$张餐桌,第$i$张可容纳$c_i$个代表就餐 同一个单位的代表需要在不同的餐桌就餐 问是否可行,要求输出方案 Sol 比较zz ...
- 洛谷 - P3254 圆桌问题(最大流+路径打印)
题目链接:点击查看 题目大意:n个单位的员工来吃饭,每个单位有ai名员工,现在有m张桌子,每张桌子能容纳bi个人,现在要求将每个员工分配到桌子上用餐,需要满足的一个要求是每张桌子上不能有相同单位的两个 ...
- [网络流24题]圆桌问题
Description 假设有来自$n$个不同单位的代表参加一次国际会议.每个单位的代表数分别为$r_i(i\;\in\;[1,n])$.会议餐厅共有$m$张餐桌,每张餐桌可容纳$c_i(i\;\in ...
- P3254 圆桌问题 题解
题目链接 一道模板的带权二分图匹配 工作单位和餐桌分别为该二分图的两组点 源点向每个单位所对应的点连一条流量为 r i r_i ri 的边,表示有 r i r_i ri 个人 每个餐桌所对应的点想 ...
- cogs729. [网络流24题] 圆桌聚餐
«问题描述: 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri(i=1,2,3...m), .会议餐厅共有n张餐桌,每张餐桌可容纳c i(i=1,2...n) 个代表就餐. ...
最新文章
- 如何从失焦的图像中恢复景深并将图像变清晰?
- 目标代码文件、可执行文件和库
- 软考自查:数据库设计
- JQuery,ajax异步加载selectoption/option/select多选框:
- 从svn下载下来的项目遇到的问题
- Numeral.js 是一个用于格式化和数字四则运算的js 库
- 电信机顶盒,废弃机顶盒复活,华为电信定制机顶盒,固件。设置关闭限制apk选项。安装自己所需的apk软件。
- 单片机原理及其应用试题(含答案)
- crc8校验c语言程序,单片机CRC8检验C语言实现
- Matlab基本操作与矩阵输入
- IDEA安装后双击打开无任何反应
- 张驰咨询:关于企业选择六西格玛绿带培训人员,你需要知道这些
- Acrel-3000电能管理系统保证企业生产人员的生命安全,提高生产人员的工作效率
- 魔兽怀旧服最新服务器人口,魔兽世界:仅三天时间正式服人口减少20万,怀旧服人口超越正式服...
- 关机时候计算机更新,电脑关机时提示更新,能否强制关机?
- 中国量子计算机的运算速度是,中国量子计算机问世,运算速度碾压顶级超算,美国:时代变了...
- @Validated和@Valid的使用
- 高效删除Oracle数据库中重复数据,并保留最新一条的方法
- 【RK3288 Android 7.1 / KEN】双屏异显流程
- JavaWeb以Maven整合Mybatis报错java.lang.NoClassDefFoundError(Web项目未能完全加载Maven下的依赖)
热门文章
- a标签创建超链接,利用a标签创建锚点
- php调用一个c语言写的接口问题
- 实际应用中installshield的事件处理
- PHP一个文件内多个php代码段的写法
- 解析WINDOWS中的DLL文件---经典DLL解读
- 教大家防止Jar包被反编译
- 解决Java在请求某些不受信任的https网站时会报:PKIX path building failed
- Redis 4.0深入持久化
- 24. 当效率至关重要时,请在map::operator[]与map::insert之间谨慎作出选择
- 关于RestTemplate的小笔记