6004. 「网络流 24 题」圆桌聚餐

题面

开始从零开始的\(LOJ\)刷题生活后的第一篇题解呢.

呼呼呼.

先来分析下题意吧.

有\(m\)个单位,每个单位有\(r_i\)个人,有\(n\)张桌子,每张桌子坐\(c_i\)个人.

判断是否可以让每张桌子上的人都分属于不同的单位,可以的话然后输出任意一个组合方式.

这样的话大致思路就出来了,每个单位的\(r_i\)个人中,每个人都要分属到不同的桌子去.

也就是说可以画成这样的图:

左集中的点可以连向右集中的所有点,但是有自身人数的限制.

这不就是个裸的二分图多重匹配了吗.

但是我不会二分图多重匹配.

于是用网络流来写.(抱紧我的网络流)

用一个超级源点,连向左集中的所有点,流量为\(r_i\).意为通过左集中流经\(i\)点的流量不能超过\(r_i\).

再把右集中的所有点连向超级汇点,流量为\(c_i\).意为右集中流经\(i\)点的流量不能超过\(c_i\).

然后把左集和右集的点全部连起来,流量为\(1\).因为一张桌子不能坐\(1\)个以上的任意一个单位的人.

如果流满的话,就说明有解.即最大流等于所有单位的人数.

然后遍历左集中的点连向的所有边,如果边上的流量变为了\(0\)(因为在Dinic过程中会把流经边的流量转移到残量上),就说明经过了这条边,输出即可科技为了我.

代码


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>#define ll long long
#define INF 2147483647
#define debug(x) printf("bebug:%lld\n",x)using namespace std;struct edge
{ll to,flow,next;
}e[1000010];queue<ll>q;ll size,m,n,start,end,cnt,ans;
ll head[1000010],dis[1000010],copy_[1000010];
bool flag[1000010];inline void EdgeAdd(ll,ll,ll);
inline void Dinic();
inline bool bfs();
inline ll dfs(ll,ll);
inline void print(ll);signed main(void)
{memset(head,-1,sizeof(head));scanf("%lld%lld",&m,&n);start=0;end=n+m+1;for(ll _=1;_<=m;_++){ll a;scanf("%lld",&a);cnt+=a;EdgeAdd(start,_,a);EdgeAdd(_,start,0);for(ll __=1;__<=n;__++){EdgeAdd(_,__+m,1);EdgeAdd(__+m,_,0);}}for(ll _=1;_<=n;_++){ll table;scanf("%lld",&table);EdgeAdd(_+m,end,table);EdgeAdd(end,_+m,0);}Dinic();if(ans==cnt){printf("1\n");for(ll _=1;_<=m;_++){print(_);printf("\n");}}else{printf("0\n");}
return 0;
}inline void EdgeAdd(ll from,ll to,ll flow)
{e[size].to=to;e[size].flow=flow;e[size].next=head[from];head[from]=size++;
}inline void Dinic()
{while(bfs()){memcpy(copy_,head,sizeof(head));ans+=dfs(start,INF);}
}inline bool bfs()
{memset(flag,false,sizeof(flag));memset(dis,0,sizeof(dis));q.push(start);flag[start]=true;while(q.empty()==false){ll from=q.front();q.pop();for(ll _=head[from];_!=-1;_=e[_].next){ll to=e[_].to;ll flow_=e[_].flow;if(flow_>0&&flag[to]==false){dis[to]=dis[from]+1;flag[to]=true;q.push(to);}}}
return flag[end];
}inline ll dfs(ll from,ll flow)
{if(from==end||flow==0){return flow;}ll sum=0;for(ll &_=copy_[from];_!=-1;_=e[_].next){ll to=e[_].to;ll flow_=e[_].flow;if(flow_>0&&dis[to]==dis[from]+1){ll f=dfs(to,min(flow_,flow-sum));e[_].flow-=f;e[_^1].flow+=f;sum+=f;if(sum==flow)return sum;}}
return sum;
}inline void print(ll from)
{for(ll _=head[from];_!=-1;_=e[_].next){ll to=e[_].to;ll flow_=e[_].flow;if(flow_==0&&to>from){printf("%lld ",to-m);//注意这里减去单位数,因为代表桌子的点的编号是在代表单位的点的编号后面的}}
}

转载于:https://www.cnblogs.com/Lemir3/p/11157511.html

多国首脑圆桌聚餐报道相关推荐

  1. LibreOJ 6004. 「网络流 24 题」圆桌聚餐 网络流版子题

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

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

    我发现我的网络流真的建模很差....这题2星的难度,我觉得我完全可以做下来,但是最终还是无法设计出一个显式的方案,或者说两个限制条件没有结合起来:最终看了hzwer神犇的题解才明白. 题目传送cogs ...

  3. 【LOJ 网络流24题】圆桌聚餐

    圆桌聚餐 题解: 从SSS向每个单位连接流量为rir_iri​的边,每个单位向每个桌子连接流量为111的边,每个桌子向TTT连接流量为cic_ici​的边,跑最大流即可.如果满流,即maxflow=m ...

  4. 【网络流24题】圆桌聚餐(二分图)

    传送门 圆桌聚餐 I think 增设源汇点S T,S向单位连容量为单位人数的边,每张桌子向T连容量为桌子容纳人数的边,每个人向每张桌子连容量为1的边,整张图的最大流==总人数时即有解. Code # ...

  5. 【网络流24题】圆桌聚餐

    LOJ 6004 [网络流24题]圆桌聚餐 题面 假设有来自\(n\)个不同单位的代表参加一次国际会议.每个单位的代表数分别为\(r_i\).会议餐厅共有\(m\)张餐桌,每张餐桌可容纳\(c_i\) ...

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

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

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

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

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

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

  9. #6004. 「网络流 24 题」圆桌聚餐(重点整理两种网络流输出方式)

    P3254 圆桌问题 题意:就是让不同的单位的员工做不同的桌子,并输出方案. 建图很好想,就不多**了. 关键是路径输出: for(int i = 1; i <= m; i++){int len ...

最新文章

  1. 手把手教你用seq2seq模型创建数据产品(附代码)
  2. 微博登录界面的PHP代码,关于接入微博登录的代码实现
  3. 框架:springboot组合spring、springmvc、mybatis的一个小demo
  4. BERT+知识图谱:北大-腾讯联合推出知识赋能的K-BERT模型
  5. bootstrap 图片预览_教你简单用Photoshop制作GIF图片
  6. vue属性_computed(计算属性)methods(方法)
  7. 集合使用与内部实现原理
  8. 学生PHP校园超市网站制作 学生PHP网页毕设源码 学生动态数据库网站作品 PHP电子商务商城购物网站
  9. 在Reporting Services (RDL)中自动生成大量列
  10. 关于setInterval设置倒计时只执行一次,clearInterval停止
  11. 【Nature论文浅析】基于模型的AlphaGo Zero
  12. poj1270_toposort+回溯
  13. Python Qt GUI设计简介、环境下载和安装(基础篇—1)
  14. 汇编实验一 查看CPU和内存,用机器指令和汇编语言指令编程
  15. 大华出入口管理系统H710服务器配置,DH-DSS-H710S2 大华出入口综合管理系统 人员车辆管理车场收费...
  16. DFRobot for Arduino 中级套件
  17. 俄亥俄州立大学计算机科学转学成功,国内普二本学生成功转学美国俄亥俄州立大学...
  18. IP地址分类(A类 B类 C类 D类 E类)
  19. Linux开机启动项详解
  20. ABAP 关于 delete adjacent duplicates from的小心得

热门文章

  1. java 导出word乱码问题,99%解决问题
  2. ROS入门保姆级教程:5-ROS计算图
  3. Linux C 中的进程
  4. 基于SIM800的GPRS通信实现
  5. Quora推广引流(外贸B2B月均60+优质询盘)
  6. 消息102 级别15 状态1 服务器,Sql过程 - 错误消息102,级别15,状态1,行56
  7. MRPII/ERP软件系统的实现(转)
  8. 果卿居士:她怀不上孩子因为吃蛋太多
  9. 3、基于51单片机的智能水箱控制系统-温度-PH值-水位(仿真+程序+原理图)
  10. Frequently Asked Questions About CC