题目描述

假设有来自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 个方案。

输入输出样例

输入样例#1: 复制

4 5
4 5 3 5
3 5 2 6 4

输出样例#1: 复制

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 圆桌问题相关推荐

  1. 洛谷 P3254 圆桌问题

    PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P3254 圆桌问题 题目 题目描述 有来自 m m m 个不同单位的代表参加一次国际会议.第 i i i 个单位派出了 r i r_ ...

  2. P3254 圆桌问题

    P3254 圆桌问题 题目描述 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为\(ri (i =1,2,--,m)\). 会议餐厅共有\(n\)张餐桌,每张餐桌可容纳\(ci ...

  3. 网络流24题 圆桌聚餐

    原题位置: http://cogs.sxysxy.org:8080/cogs/problem/problem.php?pid=729 (这个有SPJ) 这个题是一个裸的网络流板子题,都说网络流难在建图 ...

  4. [网络流24题]圆桌聚餐

    网络流大法好!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ...

  5. COGS 729 [网络流24题] 圆桌聚餐

    «问题描述: 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri(i=1,2,3...m), .会议餐厅共有n张餐桌,每张餐桌可容纳c i(i=1,2...n) 个代表就餐. ...

  6. 洛谷P3254 圆桌问题(最大流)

    题意 $m$个不同单位代表参加会议,第$i$个单位有$r_i$个人 $n$张餐桌,第$i$张可容纳$c_i$个代表就餐 同一个单位的代表需要在不同的餐桌就餐 问是否可行,要求输出方案 Sol 比较zz ...

  7. 洛谷 - P3254 圆桌问题(最大流+路径打印)

    题目链接:点击查看 题目大意:n个单位的员工来吃饭,每个单位有ai名员工,现在有m张桌子,每张桌子能容纳bi个人,现在要求将每个员工分配到桌子上用餐,需要满足的一个要求是每张桌子上不能有相同单位的两个 ...

  8. [网络流24题]圆桌问题

    Description 假设有来自$n$个不同单位的代表参加一次国际会议.每个单位的代表数分别为$r_i(i\;\in\;[1,n])$.会议餐厅共有$m$张餐桌,每张餐桌可容纳$c_i(i\;\in ...

  9. P3254 圆桌问题 题解

    题目链接 一道模板的带权二分图匹配 工作单位和餐桌分别为该二分图的两组点 源点向每个单位所对应的点连一条流量为 r i r_i ri​ 的边,表示有 r i r_i ri​ 个人 每个餐桌所对应的点想 ...

  10. cogs729. [网络流24题] 圆桌聚餐

    «问题描述: 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri(i=1,2,3...m), .会议餐厅共有n张餐桌,每张餐桌可容纳c i(i=1,2...n) 个代表就餐. ...

最新文章

  1. 如何从失焦的图像中恢复景深并将图像变清晰?
  2. 目标代码文件、可执行文件和库
  3. 软考自查:数据库设计
  4. JQuery,ajax异步加载selectoption/option/select多选框:
  5. 从svn下载下来的项目遇到的问题
  6. Numeral.js 是一个用于格式化和数字四则运算的js 库
  7. 电信机顶盒,废弃机顶盒复活,华为电信定制机顶盒,固件。设置关闭限制apk选项。安装自己所需的apk软件。
  8. 单片机原理及其应用试题(含答案)
  9. crc8校验c语言程序,单片机CRC8检验C语言实现
  10. Matlab基本操作与矩阵输入
  11. IDEA安装后双击打开无任何反应
  12. 张驰咨询:关于企业选择六西格玛绿带培训人员,你需要知道这些
  13. Acrel-3000电能管理系统保证企业生产人员的生命安全,提高生产人员的工作效率
  14. 魔兽怀旧服最新服务器人口,魔兽世界:仅三天时间正式服人口减少20万,怀旧服人口超越正式服...
  15. 关机时候计算机更新,电脑关机时提示更新,能否强制关机?
  16. 中国量子计算机的运算速度是,中国量子计算机问世,运算速度碾压顶级超算,美国:时代变了...
  17. @Validated和@Valid的使用
  18. 高效删除Oracle数据库中重复数据,并保留最新一条的方法
  19. 【RK3288 Android 7.1 / KEN】双屏异显流程
  20. JavaWeb以Maven整合Mybatis报错java.lang.NoClassDefFoundError(Web项目未能完全加载Maven下的依赖)

热门文章

  1. a标签创建超链接,利用a标签创建锚点
  2. php调用一个c语言写的接口问题
  3. 实际应用中installshield的事件处理
  4. PHP一个文件内多个php代码段的写法
  5. 解析WINDOWS中的DLL文件---经典DLL解读
  6. 教大家防止Jar包被反编译
  7. 解决Java在请求某些不受信任的https网站时会报:PKIX path building failed
  8. Redis 4.0深入持久化
  9. 24. 当效率至关重要时,请在map::operator[]与map::insert之间谨慎作出选择
  10. 关于RestTemplate的小笔记