题意

假设有来自 nn n 个不同单位的代表参加一次国际会议。每个单位的代表数分别为 riri r_i ​​。会议餐厅共有 mm m 张餐桌,每张餐桌可容纳 cici c_i​​ 个代表就餐。
为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。

试设计一个算法,给出满足要求的代表就餐方案。

题解

最大流

代码

#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int nmax = 1e6+7;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const ull p = 67;
const ull MOD = 1610612741;
int n, m;
int ss[nmax], top;
struct Dinic {int head[nmax], cur[nmax], d[nmax];bool vis[nmax];int tot, n, m, s, t, front, tail;int qqq[nmax];struct edge {int nxt, to, w, cap, flow;} e[nmax<<1];void init(int n) {this->n = n;memset(head, -1, sizeof head);memset(e,0,sizeof e);this->tot = 0;}int add_edge(int u, int v, int c) {int temp = tot;e[tot].to = v, e[tot].cap = c, e[tot].flow = 0;e[tot].nxt = head[u];head[u] = tot++;e[tot].to = u, e[tot].cap = c, e[tot].flow = c;e[tot].nxt = head[v];head[v] = tot++;return temp;}bool BFS() {
//        memset(vis, 0, sizeof(vis));
//        queue<int>Q;for(int i = 0; i <= n; ++i) vis[i] = false;front = tail = 0;vis[s] = 1; d[s] = 0;
//        Q.push(s);qqq[tail++] = s;while (front < tail) {
//            int u = Q.front(); Q.pop();int u = qqq[front++];for (int i = head[u]; i != -1; i = e[i].nxt) {int v = e[i].to;if (!vis[v] && e[i].cap > e[i].flow) {vis[v] = 1;d[v] = d[u] + 1;
//                    Q.push(v);qqq[tail++] = v;}}}return vis[t];}int DFS(int x, int a) {if (x == t || a == 0) return a;int Flow = 0, f;for (int& i = cur[x]; i != -1; i = e[i].nxt) {int v = e[i].to;if (d[v] == d[x] + 1 && (f = DFS(v, min(a, e[i].cap - e[i].flow))) > 0) {Flow += f;e[i].flow += f;e[i ^ 1].flow -= f;a -= f;if (a == 0) break;}}return Flow;}int Maxflow(int s, int t) {this->s = s, this->t = t;int Flow = 0;while (BFS()) {for (int i = 0; i <= n; i++) cur[i] = head[i];Flow += DFS(s,INF);}return Flow;}
} dinic;
int main(){scanf("%d %d", &n, &m);int s = 0, t = n + m + 1, tmp;dinic.init(t);int totpeo = 0;for(int i = 1; i <= n; ++i) {scanf("%d", &tmp);totpeo  += tmp;dinic.add_edge(s, i, tmp);for(int j = n + 1; j <= n + m; ++j) {dinic.add_edge(i, j, 1);}}for(int j = n + 1; j <= n + m; ++j) {scanf("%d", &tmp);dinic.add_edge(j, t, tmp);}int mxflow = dinic.Maxflow(s, t);if(mxflow == totpeo) {printf("1\n");for(int u = 1; u <= n; ++u) {top = 0;for(int i = dinic.head[u]; i != -1; i = dinic.e[i].nxt) {int v = dinic.e[i].to;if(i % 2 == 0 && dinic.e[i].flow == 1) {ss[++top] = v - n;}}for(int i = 1; i <= top; ++i) {if(i == 1) printf("%d", ss[i]);else printf(" %d", ss[i]);}printf("\n");}} else {printf("0\n");}return 0;
}

【网络流24题】圆桌聚餐 (最大流)相关推荐

  1. 网络流24题 圆桌聚餐

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

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

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

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

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

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

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

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

    从s向每个单位连一条容量为ri的边,从每个餐桌向汇点连一条容量为ci的边,每个单位与每个餐桌之间连一条容量为1的边,最大流即为答案. // q.c#include<iostream> #i ...

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

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

  7. 餐巾计划问题 线性规划与网络流24题之10 费用流

    相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...

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

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

  9. 【网络流24题】圆桌聚餐(最大流)

    [网络流24题]圆桌聚餐(最大流) 题面 Cogs 题解 这道题很简单 首先每个单位的人数限制 直接从源点向单位连边,容量为人数 同样的, 每个桌子向汇点连边,容量为可以坐的人数 因为每个桌子只能够做 ...

  10. loj #6004. 「网络流 24 题」圆桌聚餐(最大流)

    #6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数 ...

最新文章

  1. unbutu18.04.4 截图工具 flameshot
  2. 【树莓派】为树莓派配置或扩展swap分区
  3. 检查Bash数组是否包含值
  4. 解决:XCODE 4.2 无法连接SVN,提示:Unable to load revisions
  5. activiti如何最后一次提交事务_MySQL如何找出未提交事务的SQL浅析
  6. 软件获取手机的ime权限_【手机谷歌软件下载】【安卓+iOS】老湿机最爱~免翻,获取各种“特殊”资源!...
  7. mysql 排序后 下一条记录_Mysql如何使用order by工作
  8. 一个已经存在 10 年,却被严重低估的库
  9. shiro学习(1):shiro简介
  10. 迷雾世界无限号服务器,迷雾世界部分服务器互通公告_迷雾世界部分服务器3月31日数据互通详情分析_手心游戏...
  11. 【Java】关键词梳理
  12. mysql 数据透视_sql怎么做数据透视表
  13. Manjaro安装以及美化教程
  14. java操作word替换文字和在固定位置插入表格
  15. Flutter 数据持久化
  16. 用函数求最大公约数c语言,C语言求最大公约数公式分享
  17. 键盘录入 写入文件 quit时 结束
  18. wget linux
  19. 1053: 正弦函数
  20. Android 高德地图中路线规划绘制界面线路

热门文章

  1. 4 个快速的 Python 编译器
  2. 【报错】java -jar 命令启动后中文乱码
  3. Abaqus内置LaRC05失效准则子程序(附cohesive单元umat子程序开发教程)
  4. xp系统启动qq就蓝屏怎么回事?
  5. css浮动、清除浮动和定位
  6. MATLAB插值:柏林噪声插值
  7. python对市场营销的认识和理解_对市场营销的认识与看法
  8. 产品经理工作职责(个人总结)
  9. CAD安装未完成,某些产品无法安装。Autodesk licensing未安装(错误代码:70)
  10. eclipse中spring访问mysql的简易实现