link

其实网络流就是再考你如何去建边。

先见$S$,$T$为源点与汇点,然后将$S$连向每一个单位,流量为每个单位的人数,然后将每一个单位连向每一个餐桌,流量为$1$,最后在将每一个餐桌与$T$相连,流量为每个餐桌容量,然后跑一边$Dinic$最大流就行,只需要优化一点点,每次$dfs$增广多条增广路就行,第一问就做完了($0$还是$1$)。第二问要去求到底在那一桌,我们可以去扫描当前的图,然后若$a$,$b$相连,且$a$为单位,$b$为餐桌,并且当前流量等于$0$,则必$a$集团的人道$b$桌吃饭,然后就输出就行。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<queue>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
queue<int> que;
const int MAXN=;
const int inf=INT_MAX;
struct node{
int u,v,w,nex;
}x[MAXN<<];
struct NODE{
int edge,lst;
}pre[MAXN<<];
int m,n,S,T,cnt,head[MAXN],num[MAXN],lim[MAXN],deep[MAXN];
void add(int u,int v,int w){
x[cnt].u=u,x[cnt].v=v,x[cnt].w=w,x[cnt].nex=head[u],head[u]=cnt++;
}
bool bfs(){
memset(deep,/,sizeof(deep));
int INF=deep[];
while(!que.empty()) que.pop();
deep[S]=;que.push(S);
while(!que.empty()){
int xx=que.front();que.pop();
for(int i=head[xx];i!=-;i=x[i].nex){
if(x[i].w&&deep[x[i].v]>deep[xx]+){
deep[x[i].v]=deep[xx]+;
que.push(x[i].v);
}
}
}
return deep[T]!=INF;
}
int ST,lowflow,ans,VIS;
inline int dfs(int xx,int flow){
if(xx==T) {
ans+=flow;
VIS=;
return flow;
}
int used=;
for(int i=head[xx];i!=-;i=x[i].nex){
if(deep[x[i].v]==deep[xx]+&&x[i].w){
int slow=dfs(x[i].v,min(flow-used,x[i].w));
if(slow){
used+=slow;
x[i].w-=slow;
x[i^].w+=slow;
if(used==flow) break;
}
}
}
return used;
}
inline int dinic(){
while(bfs()){
VIS=;
while(VIS==){
VIS=;
dfs(S,inf);
}
}
return ans;
}
int main(){
memset(head,-,sizeof(head));
m=read(),n=read();
S=,T=n+m+;
for(int i=;i<=m;i++){
num[i]=read();add(S,i,num[i]),add(i,S,);
for(int j=;j<=n;j++) add(i,j+m,),add(j+m,i,);
ST+=num[i];
}
for(int i=;i<=n;i++){
lim[i]=read();
add(i+m,T,lim[i]),add(T,i+m,);
}
int st=dinic();
if(st!=ST){printf("%d\n",);return ;}
printf("%d\n",);
for(int i=;i<=m;i++){
for(int j=head[i];j!=-;j=x[j].nex){
if(x[j].v>=m+&&x[j].v<=m+n+&&!x[j].w){
printf("%d ",x[j].v-m);
}
}
printf("\n");
}
}

[LOJ 6004] 圆桌聚餐的更多相关文章

  1. LibreOJ 6004 圆桌聚餐 (最大流)

    题解:天啊,这道最大流真是水的一批……只需要每张桌子向每个单位建一条容量为1的边,源点向桌子建边,容量为桌子能坐的人数;单位向汇点建边,容量为单位人数即可,然后根据单位与桌子的连边值是否为一来了解每个 ...

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

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

  3. Libre 6004 「网络流 24 题」圆桌聚餐(网络流,最大流)

    Libre 6004 「网络流 24 题」圆桌聚餐(网络流,最大流) Description 假设有来自n个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri.会议餐厅共有m张餐桌,每张餐桌 ...

  4. AC日记——圆桌聚餐 cogs 729

    729. [网络流24题] 圆桌聚餐 ★★   输入文件:roundtable.in   输出文件:roundtable.out   评测插件时间限制:1 s   内存限制:128 MB «问题描述: ...

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

    [网络流24题] 圆桌聚餐 ★★ 输入文件:roundtable.in 输出文件:roundtable.out 评测插件 时间限制:1 s 内存限制:128 MB «问题描述: 假设有来自m 个不同单 ...

  6. 【刷题】LOJ 6004 「网络流 24 题」圆桌聚餐

    题目描述 假设有来自 \(n\) 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 \(r_i\) .会议餐厅共有 \(m\) 张餐桌,每张餐桌可容纳 \(c_i\)​​ 个代表就餐. 为了使 ...

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

    题意: 来自n个不同国家的代表开会,每个国家代表数为ci 会场有m张圆桌,每张桌子可容纳mi人 不希望有同一个国家的代表在同一张桌子上就餐 设计一个合法方案 (n,m<=300) 思路:最大流, ...

  8. [cogs729] [网络流24题#5] 圆桌聚餐 [网络流,最大流,多重二分图匹配]

    建图:从源点向单位连边,边权为单位人数,从单位向圆桌连边,边权为1,从圆桌向汇点连边,边权为圆桌容量. #include <iostream> #include <algorithm ...

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

    题意: 来自n个不同国家的代表开会,每个国家代表数为ci 会场有m张圆桌,每张桌子可容纳mi人 不希望有同一个国家的代表在同一张桌子上就餐 设计一个合法方案 (n,m<=300) 思路:最大流, ...

随机推荐

  1. Android Studio|IntelliJ IDEA 常用快捷键(Mac|Window)

    一 For Mac(Mac OS X 10.5+) F1 显示注释文档F2 高亮错误或警告快速定位Command + F12 显示当前文件的结构(查看所有方法)Command + F 查找文本Comm ...

  2. ortp代码简析

    ortp初始化 /** *    Initialize the oRTP library. You should call this function first before using *     ...

  3. php redis和java混用问题

    目前项目是 一个php 一个java  共用一套 redis  key  value 也都一样,  java 使用 gson 解析json   会将php 设置的json里面看  {"a&q ...

  4. POJ 1679 The Unique MST(最小生成树)

    Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definit ...

  5. centos配置iptables

    第一次配置前消除默认的规则 #这个一定要先做,不然清空后可能会悲剧 iptables -P INPUT ACCEPT #清空默认所有规则 iptables -F #清空自定义的所有规则 iptable ...

  6. wpa_supplicant下行接口浅析

    wpa_supplicant通过socket通信机制实现下行接口,与内核进行通信,获取信息或下发命令. 以下摘自http://blog.csdn.net/fxfzz/article/details/6 ...

  7. 团队作业week9 情景测试

    一.使用人群:学生.计算机工作者.对计算机感兴趣的人 1.学生:学生是学霸系统的主要用户.学生一般会通过网络寻找与自己的课程,作业有关的信息.首先,可以通过我们的搜索功能在我们的数据库中寻找我们从网络 ...

  8. (beta冲刺5/7)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 推进后端完成安卓端接口的开发 在测试中发现返回地图接口存在错误(待修复) 推进 ...

  9. ACM 第六天

    图论 网络流 最大流 INF(初始值) 路径上权值最小的边,决定流量大小. 流量网络的三个特性: ①流量控制 ②反对称性 ③流量守恒 残余网络:保留了c(e)容量<f(e)流量[可以继续流,因为 ...

  10. kmeans算法理解及代码实现

    github:kmeans代码实现1.kmeans代码实现2(包含二分k-means) 本文算法均使用python3实现 1 聚类算法   对于"监督学习"(supervised ...