P3254 圆桌问题

题面

题目描述

假设有来自 \(m\) 个不同单位的代表参加一次国际会议。每个单位的代表数分别为 \(r_i (i =1,2,……,m)\) 。

会议餐厅共有 \(n\) 张餐桌,每张餐桌可容纳 \(c_i (i =1,2,……,n)\) 个代表就餐。

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

对于给定的代表数和餐桌数以及餐桌容量,编程计算满足要求的代表就餐方案。

输入输出格式

输入格式:

第 \(1\) 行有 \(2\) 个正整数 \(m\) 和 \(n\) , \(m\) 表示单位数, \(n\) 表示餐桌数, \(1 \leq m \leq 150, 1 \leq n \leq 270\) 。

第 \(2\) 行有 \(m\) 个正整数,分别表示每个单位的代表数。

第 \(3\) 行有 \(n\) 个正整数,分别表示每个餐桌的容量。

输出格式:

如果问题有解,第 \(1\) 行输出 \(1\) ,否则输出 \(0\) 。接下来的 \(m\) 行给出每个单位代表的就餐桌号。如果有多个满足要求的方案,只要输出 \(1\) 个方案。

输入输出样例

输入样例:

4 5
4 5 3 5
3 5 2 6 4

输出样例:

1
1 2 4 5
1 2 3 4 5
2 4 5
1 2 3 4 5

思路

经典的网络流题。设一个 炒鸡 超级源点 \(S\) 和一个超级汇点 \(T\) 。对于每一个单位,从源点向单位编号节点连接流量为单位代表数的流;对于每一个餐桌,从餐桌编号节点向汇点连接流量为餐桌容量的流;对于每一组单位和餐桌,连接流量为 \(1\) 的流。那么若该网络能满流,则可以得出一个可行的方案。统计方案是,只需查询每条边单位和餐桌之间的边是否还有流量即可。

AC代码

#include<bits/stdc++.h>
using namespace std;
int m,n,s,t,sum,ans,dep[455],cur[455];
int cnt=1,top[455],to[90005],cap[90005],nex[90005];
inline int read()
{
int re=0;
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
return re;
}
inline void add_edge(int x,int y,int z)
{
to[++cnt]=y,cap[cnt]=z,nex[cnt]=top[x],top[x]=cnt;
to[++cnt]=x,cap[cnt]=0,nex[cnt]=top[y],top[y]=cnt;
}
bool dinic()
{
memset(dep,0,sizeof dep);
memset(cur,0,sizeof cur);
dep[s]=1,cur[s]=top[s];
queue<int>Q;
Q.push(s);
while(!Q.empty())
{
int now=Q.front();Q.pop();
for(int i=cur[now];i;i=nex[i])
if(cap[i]&&!dep[to[i]])
{
dep[to[i]]=dep[now]+1,cur[to[i]]=top[to[i]];
Q.push(to[i]);
}
}
return dep[t]!=0;
}
int dfs(int now,int flow)
{
if(now==t) return flow;
int re=0;
for(int &i=cur[now];i;i=nex[i])
if(cap[i]&&dep[to[i]]==dep[now]+1)
{
int lzq=dfs(to[i],min(flow,cap[i]));
if(lzq)
{
re+=lzq,flow-=lzq;
cap[i]-=lzq,cap[i^1]+=lzq;
if(!flow) break;
}
}
return re;
}
int main()
{
m=read(),n=read(),s=m+n+1,t=s+1;
for(int i=1;i<=m;i++)
{
int x=read();sum+=x;
add_edge(s,i,x);
}
for(int i=m+1;i<=m+n;i++)
{
int x=read();
add_edge(i,t,x);
}
for(int i=1;i<=m;i++)
for(int j=m+n;j>=m+1;j--)
add_edge(i,j,1);
while(dinic()) ans+=dfs(s,INT_MAX);
if(ans!=sum) printf("0");
else
{
puts("1");
for(int i=1;i<=m;i++)
{
for(int j=top[i];j;j=nex[j])
{
if(j&1) continue;
if(!cap[j]) printf("%d ",to[j]-m);
}
puts("");
}
}
return 0;
}

Luogu P3254 圆桌问题(最大流)的更多相关文章

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

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

  2. Luogu P3254 圆桌问题

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

  3. P3254 圆桌问题 网络流

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

  4. 【P3254】圆桌问题(最大流,洛谷)

    看到题目,产生第一反应,是否可以匹配的是这么多.那么连边跑一遍最大流就行了. 从源点向每个单位连一条长度为l的边,然后所有单位和餐桌分别连边,流量为1,所有餐桌向汇点连边,流量为餐桌容量.然后跑一遍最 ...

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

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

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

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

  7. 网络流之P3254 圆桌问题

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

  8. 【Luogu P3376】网络最大流

    Luogu P3376 最大流是网络流模型的一个基础问题. 网络流模型就是一种特殊的有向图. 概念: 源点:提供流的节点(入度为0),类比成为一个无限放水的水厂 汇点:接受流的节点(出度为0),类比成 ...

  9. 洛谷 [P3254] 圆桌问题

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

随机推荐

  1. 03_springboot2.x日志处理

    1.日志框架 ​ 市场上存在非常多的日志框架.JUL(java.util.logging),JCL(Apache Commons Logging),Log4j,Log4j2,Logback.SLF4j ...

  2. python 对excel操作

    在python中,对excel表格读,写,追加数据,用以下三个模块:1.wlrd 读取excel表中的数据2.xlwt 创建一个全新的excel文件,然后对这个文件进行写入内容以及保存.3.xluti ...

  3. http及浏览器相关知识点归纳

    http是应用层协议,采用请求/响应模型 1.浏览器地址栏输入URL地址后发生了什么? 浏览器判断地址是否是合理的URL地址,是否是http协议请求,如果是则进入下一步 浏览器对此URL进行缓存检查: ...

  4. Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试【转】

    Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试[转] 本文是本人前一段时间做一个简单Java监控工具调研总 ...

  5. Ubuntu下安装和配置Apache2,小编觉得挺不错的,现在就分享给大家

    本篇文章主要介绍了详解Ubuntu下安装和配置Apache2,小编觉得挺不错的,现在就分享给大家,也给大家做个参考.有兴趣的朋友可以了解一下.(http://xz.8682222.com) 在Ubun ...

  6. Java驼峰和下划线互相转化

    直接上代码 : package com.utils; public class ChangeChar { public static final char UNDERLINE = '_'; publi ...

  7. csps模拟测试74梦境,玩具,飘雪圣域题解

    题面:https://www.cnblogs.com/Juve/articles/11679226.html 梦境: 其实还是挺水的,排序错了过不了样例,打了个二分图匹配就跑了 #include< ...

  8. Vue生命周期的执行过程(面试必备) 极简版

    最近准备面试,临时抱佛脚的来回顾一下vue相关的面试题,当然这是不对的,平时还是要努力呀,走起: 1.创建vue实例,Vue(); 2.在创建Vue实例的时候,执行了init(),在init过程中首先 ...

  9. 清空标签间的内容(innerHTML)和 value

    jquery 方式: 清空标签的innerHTML: $("#divId").html(""); 清空标签的value: $("#divId" ...

  10. redis深入学习(一)-----CAP、redis数据类型

    NoSQL数据库的四大分类 KV键值: memcache+redis 文档型数据库(bson格式比较多): MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在 ...