[LOJ 6004] 圆桌聚餐
其实网络流就是再考你如何去建边。
先见$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] 圆桌聚餐的更多相关文章
- LibreOJ 6004 圆桌聚餐 (最大流)
题解:天啊,这道最大流真是水的一批……只需要每张桌子向每个单位建一条容量为1的边,源点向桌子建边,容量为桌子能坐的人数;单位向汇点建边,容量为单位人数即可,然后根据单位与桌子的连边值是否为一来了解每个 ...
- LibreOJ 6004. 「网络流 24 题」圆桌聚餐 网络流版子题
#6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数 ...
- Libre 6004 「网络流 24 题」圆桌聚餐(网络流,最大流)
Libre 6004 「网络流 24 题」圆桌聚餐(网络流,最大流) Description 假设有来自n个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri.会议餐厅共有m张餐桌,每张餐桌 ...
- AC日记——圆桌聚餐 cogs 729
729. [网络流24题] 圆桌聚餐 ★★ 输入文件:roundtable.in 输出文件:roundtable.out 评测插件时间限制:1 s 内存限制:128 MB «问题描述: ...
- Cogs 729. [网络流24题] 圆桌聚餐
[网络流24题] 圆桌聚餐 ★★ 输入文件:roundtable.in 输出文件:roundtable.out 评测插件 时间限制:1 s 内存限制:128 MB «问题描述: 假设有来自m 个不同单 ...
- 【刷题】LOJ 6004 「网络流 24 题」圆桌聚餐
题目描述 假设有来自 \(n\) 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 \(r_i\) .会议餐厅共有 \(m\) 张餐桌,每张餐桌可容纳 \(c_i\) 个代表就餐. 为了使 ...
- 【PowerOJ1740&网络流24题 圆桌聚餐】(最大流)
题意: 来自n个不同国家的代表开会,每个国家代表数为ci 会场有m张圆桌,每张桌子可容纳mi人 不希望有同一个国家的代表在同一张桌子上就餐 设计一个合法方案 (n,m<=300) 思路:最大流, ...
- [cogs729] [网络流24题#5] 圆桌聚餐 [网络流,最大流,多重二分图匹配]
建图:从源点向单位连边,边权为单位人数,从单位向圆桌连边,边权为1,从圆桌向汇点连边,边权为圆桌容量. #include <iostream> #include <algorithm ...
- 【PowerOJ1740&网络流24题】圆桌聚餐(最大流)
题意: 来自n个不同国家的代表开会,每个国家代表数为ci 会场有m张圆桌,每张桌子可容纳mi人 不希望有同一个国家的代表在同一张桌子上就餐 设计一个合法方案 (n,m<=300) 思路:最大流, ...
随机推荐
- 中文乱码的处理—@北河的ppt
- bson文件的切分
描述 最近遇到问题需要将较大的bson文件(MongoDB导出的二进制json文件)按文档(记录)进行切分,网上这方面的资料实在太少,弄了一天多终于达到了基本要求(还不知道有没有BUG) 代码 pac ...
- JAVA基础学习之路(十)this关键字
class Book { String name; int price; int num;//构造方法之间的互相调用解决了代码的重复问题,但是一定要留出口 public Book() { ,); } ...
- 换抵挡装置 (Kickdown,ACM/ICPC NEERC 2006,UVa1588
题目描述:算法竞赛入门经典习题3-11 题目思路:1.两长条移动匹配 2.上下调换,取小者 #include <stdio.h> #include <string.h> int ...
- sql STUFF 分组
---将sql想关的数据放到一个字段里 select r.Region_Name, )) [text()] from City c2 inner join Region as r2 on c2.Reg ...
- Codeforces 96D Volleyball(最短路径)
Petya loves volleyball very much. One day he was running late for a volleyball match. Petya hasn't b ...
- puppet学习笔记
puppet优势:容易理解.用户较多.门槛低.简单.安装配置文件较少 puppet使用Ruby语言开发,安装puppet需要安装Ruby puppet运行环境:Redhat.Centos.Window ...
- 二叉搜索树(BST)---python实现
github:代码实现 本文算法均使用python3实现 1. 二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜 ...
- TCP系列39—拥塞控制—2、拥塞相关算法及基础知识
一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机制,因而易导致网络拥塞.1988年Jacobson针对TCP在网络拥塞控制方面的不足,提出了& ...
- Unity3d学习日记(三)
使用Application.LoadLevel(Application.loadedLevel);来重新加载游戏scene的方法已经过时了,我们可以使用SceneManager.LoadScene ...