题目链接

非常简单的一道网络流题

我们发现每个单位的人要坐到不同餐桌上,那也就是说每张餐桌上不能有同一单位的人。这样的话,我们对于每个单位向每张餐桌连一条边权为1的边,表示同一餐桌不得有相同单位的人。从源点向每个单位连一条边权为人数的边,从餐桌向汇点连一条边权为餐桌容量的边,这样的话跑最大流,跑出来的结果就是在满足以上条件的情况下最多能坐多少人,如果结果等于总人数,说明可行,否则不可行。

那么怎么输出方案呢?

我们记录每个单位向每张餐桌连的边的序号,如果这条边流满了,则说明这个单位有一个人坐在这张餐桌上。这样输出即可

下放代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
#define gc getchar
#define maxn 505
#define maxm 100005
using namespace std; inline ll read(){
ll a=0;int f=0;char p=gc();
while(!isdigit(p)){f|=p=='-';p=gc();}
while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
return f?-a:a;
}int n,m,S,T,ans; struct ahaha{
int w,to,next;
}e[maxm<<1];int tot,head[maxn];
inline void add(int u,int v,int w){
e[tot]={w,v,head[u]};head[u]=tot++;
} int q[maxn],dep[maxn];
int bfs(){memset(dep,-1,sizeof dep); //非常朴素的dinic
int h=0,t=1;dep[S]=0;
while(++h<=t){
int u=q[h];
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;if(~dep[v]||e[i].w<=0)continue;
dep[v]=dep[u]+1;q[++t]=v;
if(v==T)return 1;
}
}return 0;
}
int dfs(int u,int w){
if(u==T)return w;
int sum=0;
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;if(dep[v]!=dep[u]+1||e[i].w<=0)continue;
int d=dfs(v,min(w-sum,e[i].w));
e[i].w-=d,e[i^1].w+=d;
sum+=d;if(sum==w)break;
}
if(sum<w)dep[u]=-1;
return sum;
} int main(){memset(head,-1,sizeof dep);
n=read();m=read();T=n+m+1;
for(int i=1;i<=n;++i) //因为先添加这种边,所以无需记录编号,直接计算得即可
for(int j=1;j<=m;++j){
add(i,j+n,1);
add(j+n,i,0);
}
for(int i=1;i<=n;++i){
int a=read();ans+=a;
add(S,i,a);add(i,S,0);
}
for(int i=1;i<=m;++i){
int a=read();
add(n+i,T,a);add(T,n+i,0);
}
while(bfs())
ans-=dfs(S,2147483647);
if(ans){
puts("0");
return 0;
}
puts("1");
for(int i=1;i<=n;++i,puts("")) //这里就是上面说的输出方案
for(int j=1;j<=m;++j){
int p=((i-1)*m+j-1)*2;
if(e[p].w)continue;
printf("%d ",j);
}
return 0;
}

P3254 圆桌问题的更多相关文章

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

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

  2. P3254 圆桌问题 网络流

    P3254 圆桌问题 #include <bits/stdc++.h> using namespace std; , inf = 0x3f3f3f; struct Edge { int f ...

  3. 网络流之P3254 圆桌问题

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

  4. 洛谷 [P3254] 圆桌问题

    简单最大流建图 #include <iostream> #include <cstdio> #include <cstring> #include <cmat ...

  5. Luogu P3254 圆桌问题

    题目链接 \(Click\) \(Here\) 水题.记得记一下边的流量有没有跑完. #include <bits/stdc++.h> using namespace std; const ...

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

    传送门 一道良心啊……没那么多麻烦了…… 从$S$向所有单位连边,容量为单位人数,从所有桌子向$T$连边,容量为桌子能坐的人数,从每一个单位向所有桌子连边,容量为$1$,然后跑一个最大流,看一看$S$ ...

  7. [洛谷P3254]圆桌问题

    题目大意:有$m$个单位,每个单位有$r_i$个代表,有$n$张餐桌,每张餐桌可容纳$c_i$个代表.要求同一个单位的代表不在同一个餐桌就餐.若可以,输出$1$以及其中一种方案,否则输出$0$ 题解: ...

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

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

  9. 洛谷 P3254 圆桌问题【最大流】

    s向所有单位连流量为人数的边,所有饭桌向t连流量为饭桌容量的边,每个单位向每个饭桌连容量为1的边表示这个饭桌只能坐这个单位的一个人.跑dinic如果小于总人数则无解,否则对于每个单位for与它相连.满 ...

随机推荐

  1. day 43

    今日内容 1.视图 2.事务 3.SQL注入问题 4.存储过程 首先回顾一下昨天所学 子查询: in (select a where 字段名 in select b) exists(判断后面语句执行结 ...

  2. word导入导出自定义属性列表

    Sub ExportCustom() ' ' ExportCustom 宏 ' 导出自定义属性到custom.txt ' Dim lFileNumber As Long Dim sFilePath A ...

  3. 一文让您全面了解清楚HBase数据库的所有知识点,值得收藏!

    一.HBase基本概念:列式数据库 在Hadoop生态体系结构中,HBase位于HDFS(Hadoop分布式文件系统)的上一层,不依赖于MapReduce,那么如果没有HBase这种Nosql数据库会 ...

  4. [NOI2003]Editor & [AHOI2006]文本编辑器editor BZOJ1507&BZOJ1269

    分析: Splay区间操作裸题,维护出区间信息,按照要求模拟,注意读入格式,并且考虑内存回收(开不下) 附上代码: #include <cstdio> #include <algor ...

  5. 20155308《网络对抗》Exp6 信息搜集与漏洞扫描

    20155308<网络对抗>Exp6 信息搜集与漏洞扫描 原理与实践说明 实践内容 本实践的目标是掌握信息搜集的最基础技能.具体有: 各种搜索技巧的应用 DNS IP注册信息的查询 基本的 ...

  6. # 2017-2018-2 20155319《网络对抗技术》Exp9 :Web安全基础

    2017-2018-2 20155319<网络对抗技术>Exp9 :Web安全基础 实践过程 webgoat准备 从GitHub上下载jar包(老师的虚拟机中有 无需下载) 拷贝到本地,并 ...

  7. uboot启动过程理解

    对于2440而言,启动的方式不多.一般就是外界一个NAND FLASH ,2440内部有个NAND FLASH Controller,会自动把NAND FLASH的前4K拷贝到2440的片内SRAM. ...

  8. python 算法面试题

    1.题目是:有一组“+”和“-”符号,要求将“+”排到左边,“-”排到右边,写出具体的实现方法. def StringSort(data): startIndex=0 endIndex=0 count ...

  9. 怎么理解LAXCUS大操作系统系统在云计算体系中的定位

    最近一直在做laxcus大数据操作系统的分布式应用开发,因为做得多了,感触也多了.按照云计算三层定义,即iaas(基础设施即服务).paas(平台即服务).saas(软件即服务),laxcus属于pa ...

  10. Go语言实现数据结构(一)单链表

    1.基本释义 2.结构体设计 3.基本方法设计 4.Main函数测试 1. 基本释义 线性表包含两种存储方法:顺序存储结构和链式存储结构,其中顺序表的缺点是不便插入与删除数据:接下来我们重点实现基于G ...