PS:如果读过题了可以跳过题目描述直接到题解部分
提交链接:洛谷 P3254 圆桌问题

题目

题目描述

有来自 m m m 个不同单位的代表参加一次国际会议。第 i i i 个单位派出了 r i r_i ri​ 个代表。

会议的餐厅共有 n n n 张餐桌,第 i i i 张餐桌可容纳 c i c_i ci​ 个代表就餐。

为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。请给出一个满足要求的代表就餐方案。

输入格式

输入的第一行是用空格隔开的两个整数,分别代表单位的个数 m m m 和餐桌的个数 n n n。
第二行有 m m m 个用空格隔开的整数,第 i i i 个整数代表第 i i i 个单位的代表人数 r i r_i ri​。
第三行有 n n n 个用空格隔开的整数,第 i i i 个整数代表第 i i i 张餐桌能容纳的人数 c i c_i ci​。

输出格式

本题存在 Special Judge
请输出是否存在满足要求的就餐方案,若存在,请给出任意一种可行的方案。
输出的第一行是一个非 0 0 0 即 1 1 1 的整数,若存在方案则输出 1 1 1,否则输出 0 0 0。
若存在方案,则对于第 2 2 2 到第 ( m + 1 ) (m + 1) (m+1) 行,在第 ( i + 1 ) (i + 1) (i+1) 行输出 r i r_i ri​ 个整数,代表第 i i i 个单位的代表就餐的餐桌编号。

样例 #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

提示

【数据规模与约定】

  • 对于 100 % 100\% 100% 的数据,保证 1 ≤ m ≤ 150 1 \leq m \leq 150 1≤m≤150, 1 ≤ n ≤ 270 1 \leq n \leq 270 1≤n≤270, 1 ≤ r i , c i ≤ 1 0 3 1 \leq r_i, c_i \leq 10^3 1≤ri​,ci​≤103。

【提示】

  • 请注意输入的第一行先读入 m m m 再读入 n n n。

题解

这道题就是网络流24题之一。所以考点就是网络流。

因为每个单位在每桌最多坐一个人,所以我们要从每个单位向每桌建一条边权为1的边。

因为还要限制每个单位的人数和每桌的人数,所以我们要建两个超级点分别作为起点和终点,分别向所有单位建边权为单位人数的边和从所有桌建边权为每桌人数的边。

统计最大流后,将答案与所有单位的总人数相比,若小于,则输出0,反之则输出1,同时遍历所有从单位到桌的边,若边权为0,则说明这个单位向这个桌坐了一个人,就输出,然后继续遍历后面的边。

代码实现

100pts

//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
long long n,m,s,t;
long long u,v,w;
int b[610][610];
int cnt=1;
int head[610];
int dis[610];
int c[610];
long long ans;
long long an;
queue<int>q;
long long d[200];
long long z[300];
long long sum;struct edge{int v,nex;long long w;
}a[100010];void in(long long &x){int nt;x=0;while(!isdigit(nt=getchar()));x=nt^'0';while(isdigit(nt=getchar())){x=(x<<3)+(x<<1)+(nt^'0');}
}bool bfs(){memset(dis,-1,sizeof(dis));dis[s]=1;q.push(s);while(!q.empty()){int x=q.front();q.pop();for(int i=head[x];i;i=a[i].nex){if(dis[a[i].v]==-1&&a[i].w>0){dis[a[i].v]=dis[x]+1;q.push(a[i].v);}}}if(dis[t]==-1){return 0;}return 1;
}long long dfs(int x,long long minn){if(x==t){return minn;}int an,k=0;for(int i=(c[x]==-1?head[x]:c[x]);i;i=a[i].nex){if(dis[a[i].v]==dis[x]+1&&a[i].w>0){minn=min(a[i].w,minn);an=dfs(a[i].v,minn);if(an==0){dis[a[i].v]=-1;}if(an){a[i].w-=an;a[i^1].w+=an;c[x]=i;k+=an;minn-=k;return an;}}}return k;
}int main(){register int i,j;in(m),in(n);s=1;t=n+m+2;for(i=1;i<=m;++i){in(d[i]);sum+=d[i];u=1;v=i+1;if(b[u][v]){a[b[u][v]].w+=d[i];}else{b[u][v]=++cnt;a[cnt].v=v;a[cnt].w+=d[i];a[cnt].nex=head[u];head[u]=cnt;b[v][u]=++cnt;a[cnt].v=u;a[cnt].nex=head[v];head[v]=cnt;}}for(i=1;i<=n;++i){in(z[i]);u=i+m+1;v=n+m+2;if(b[u][v]){a[b[u][v]].w+=z[i];}else{b[u][v]=++cnt;a[cnt].v=v;a[cnt].w+=z[i];a[cnt].nex=head[u];head[u]=cnt;b[v][u]=++cnt;a[cnt].v=u;a[cnt].nex=head[v];head[v]=cnt;}}for(i=2;i<=m+1;++i){for(j=2;j<=n+1;++j){u=i;v=m+j;if(b[u][v]){++a[b[u][v]].w;}else{b[u][v]=++cnt;a[cnt].v=v;++a[cnt].w;a[cnt].nex=head[u];head[u]=cnt;b[v][u]=++cnt;a[cnt].v=u;a[cnt].nex=head[v];head[v]=cnt;}}}while(bfs()){memset(c,-1,sizeof(c));an=dfs(s,0xffffffff);while(an){ans+=an;an=dfs(s,0xffffffff);}}if(ans<sum){printf("0\n");return 0;}printf("1\n");for(i=2;i<=m+1;++i){for(j=2;j<=n+1;++j){if(a[b[i][j+m]].w==0){printf("%d ",j-1);}}printf("\n");}return 0;
}

洛谷 P3254 圆桌问题相关推荐

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

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

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

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

  3. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  4. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  5. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  6. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  7. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  8. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

  9. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

    昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...

最新文章

  1. 基于R的混合线性模型的实现
  2. idea上传项目到码云_mall前端项目的安装与部署
  3. Struts2标签库常用标签(转)
  4. easyui tabs 使用iframe 出现两个垂直滚动条 解决方法
  5. java计算两地距离(公里)
  6. java zookeeper 使用场景_java架构之路-(分布式zookeeper)zookeeper真实使用场景
  7. Django中的Model模型
  8. filter动态参数 maven_使用Profile和Resources Filter隔离测试环境
  9. Money 20/20 | 未来金融数字化转型:数字化半径与全栈式战略观
  10. windows libwebsocket
  11. visio破解版安装2013
  12. Ds918 ds3615 ds3617区别_都2019年了,还问GET和POST的区别【深度好文】
  13. 光立方原理讲解_3D打印设备SLA工艺原理是什么?
  14. iOS 高仿《百思不得姐》
  15. 一个c语言源文件可以包含两个以上main,二级C语言习题汇总及标准答案.doc
  16. 1.1.3 操作系统的发展与分类(手工操作阶段、批处理阶段、分时操作系统、实时操作系统、其它操作系统)
  17. C语言作业第二次总结
  18. 嵌入式计算机是专用计算机系统,嵌入式系统是一种专用的计算机系统.doc
  19. 实验4:求连续整数阶乘的和
  20. 苹果Usb连接linux,Mount iPhone in Linux using USB (ifuse, libiphone)

热门文章

  1. 使用phpspreadsheet导出数据时内存溢出处理
  2. 解决vmware的“物理内存不足”
  3. input type=number禁止输入小数
  4. Cortex-M3学习日志(二)-- 按键实验
  5. WINDOWS中无法查看显示隐藏文件的解决方法
  6. 奥运歌曲推荐:《唱响奥运》铃声 奥运歌曲推荐:《唱响奥运》...
  7. 篱笆家装宝典之十四——家具
  8. 人生中第二次面试——北漂18年(2)
  9. ARM64(TX2) ubuntu16.04 换源
  10. 可控制又有软启动的开关电路(可根需选择.....)