【P3254】圆桌问题(最大流,洛谷)
看到题目,产生第一反应,是否可以匹配的是这么多。那么连边跑一遍最大流就行了。
从源点向每个单位连一条长度为l的边,然后所有单位和餐桌分别连边,流量为1,所有餐桌向汇点连边,流量为餐桌容量。
然后跑一遍最大流即可。
输出方案的时候直接暴力枚举一个单位的所有出边即可,如果不为0,那么说明使用过,即可输出。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #include<queue>
- #define ll long long
- #define inf 50000000
- #define re register
- #define id n*(i-1)+j
- using namespace std;
- struct po
- {
- int from,to,dis,nxt;
- }edge[];
- int head[],cur[],dep[],n,m,s,t,u,num=-,x,y,l,tot,sum,d;
- int nm,a[][];
- inline int read()
- {
- int x=,c=;
- char ch=' ';
- while((ch>''||ch<'')&&ch!='-')ch=getchar();
- while(ch=='-')c*=-,ch=getchar();
- while(ch<=''&&ch>='')x=x*+ch-'',ch=getchar();
- return x*c;
- }
- inline void add_edge(int from,int to,int dis)
- {
- edge[++num].nxt=head[from];
- edge[num].from=from;
- edge[num].to=to;
- edge[num].dis=dis;
- head[from]=num;
- }
- inline void add(int from,int to,int dis)
- {
- add_edge(from,to,dis);
- add_edge(to,from,);
- }
- inline bool bfs()
- {
- memset(dep,,sizeof(dep));
- queue<int> q;
- while(!q.empty())
- q.pop();
- dep[s]=;
- q.push(s);
- while(!q.empty())
- {
- int u=q.front();
- q.pop();
- for(re int i=head[u];i!=-;i=edge[i].nxt)
- {
- int v=edge[i].to;
- if(edge[i].dis>&&dep[v]==)
- {
- dep[v]=dep[u]+;
- if(v==t)
- return ;
- q.push(v);
- }
- }
- }
- return ;
- }
- inline int dfs(int u,int dis)
- {
- if(u==t)
- return dis;
- int diss=;
- for(re int& i=cur[u];i!=-;i=edge[i].nxt)
- {
- int v=edge[i].to;
- if(edge[i].dis!=&&dep[v]==dep[u]+)
- {
- int check=dfs(v,min(dis,edge[i].dis));
- if(check>)
- {
- dis-=check;
- diss+=check;
- edge[i].dis-=check;
- edge[i^].dis+=check;
- if(dis==) break;
- }
- }
- }
- return diss;
- }
- inline int dinic()
- {
- int ans=;
- while(bfs())
- {
- for(re int i=s;i<=t;i++)
- cur[i]=head[i];
- while(int d=dfs(s,inf))
- ans+=d;
- }
- return ans;
- }
- inline void output(int x)
- {
- for(re int i=head[x];i!=-;i=edge[i].nxt)
- {
- if(edge[i].dis==)
- cout<<edge[i].to-n<<" ";
- }
- cout<<endl;
- }
- int main()
- {
- memset(head,-,sizeof(head));
- n=read();m=read();
- s=;t=n+m+;
- for(re int i=;i<=n;i++)
- {
- l=read();
- add(s,i,l);
- tot+=l;
- }
- for(re int i=;i<=m;i++)
- {
- l=read();
- add(i+n,t,l);
- }
- for(re int i=;i<=n;i++)
- for(re int j=;j<=m;j++)
- add(i,j+n,);
- sum=dinic();
- if(tot==sum)
- {
- cout<<""<<endl;
- for(re int i=;i<=n;i++)
- output(i);
- }else
- cout<<"";
- }
【P3254】圆桌问题(最大流,洛谷)的更多相关文章
- Luogu P3254 圆桌问题(最大流)
P3254 圆桌问题 题面 题目描述 假设有来自 \(m\) 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 \(r_i (i =1,2,--,m)\) . 会议餐厅共有 \(n\) 张餐桌 ...
- 图论--网络流--最大流 洛谷P4722(hlpp)
题目描述 给定 nn 个点,mm 条有向边,给定每条边的容量,求从点 ss 到点 tt 的最大流. 输入格式 第一行包含四个正整数nn.mm.ss.tt,用空格分隔,分别表示点的个数.有向边的个数.源 ...
- 洛谷P3254 圆桌问题(最大流)
题意 $m$个不同单位代表参加会议,第$i$个单位有$r_i$个人 $n$张餐桌,第$i$张可容纳$c_i$个代表就餐 同一个单位的代表需要在不同的餐桌就餐 问是否可行,要求输出方案 Sol 比较zz ...
- AC日记——网络最大流 洛谷 P3376
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...
- 洛谷P4014 分配问题【最小/大费用流】题解+AC代码
洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的 ...
- 洛谷 P4016负载平衡问题【费用流】题解+AC代码
洛谷 P4016负载平衡问题 P4014 分配问题[费用流]题解+AC代码 负载平衡问题 题目描述 GG 公司有n个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n ...
- 洛谷P4003 无限之环(infinityloop)(网络流,费用流)
洛谷题目传送门 题目 题目描述 曾经有一款流行的游戏,叫做 Infinity Loop,先来简单的介绍一下这个游戏: 游戏在一个 n ∗ m 的网格状棋盘上进行,其中有些小方格中会有水管,水管可能在格 ...
- 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】
(题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...
- 洛谷 P3128 [USACO15DEC]最大流Max Flow-树上差分(点权/点覆盖)(模板题)
因为徐州现场赛的G是树上差分+组合数学,但是比赛的时候没有写出来(自闭),背锅. 会差分数组但是不会树上差分,然后就学了一下. 看了一些东西之后,对树上差分写一点个人的理解: 首先要知道在树上,两点之 ...
- 【洛谷 P1251】 餐巾计划问题 (费用流)
题目链接 我做的网络流24题里的第一题.. 想是不可能想到的,只能看题解. 首先,我们拆点,将一天拆成晚上和早上,每天晚上会受到脏餐巾(来源:当天早上用完的餐巾,在这道题中可理解为从原点获得),每天早 ...
随机推荐
- 什么是Base64加密?为什么要有Base64加密?
产生这篇文章的动力在于对接腾讯云服务的时候每次都要进行Base64编码之后才能进行签名,之前只知道Base64是个算法,但是不知道为啥都用这个算法,这次为了链接Base64究竟是个什么东东才在网络上各 ...
- 云计算之路-阿里云上:SLB会话保持的一个坑
冒着被大家厌烦的风险,今天再发一篇“云计算之路-阿里云上”.这是在前一篇发过之后真实发生的事情,我们觉得定位问题的过程值得分享.而且估计园子里不少朋友被这个问题骚扰过,我们有责任让大家知道问题的真正原 ...
- 帝国CMS 7.2数据导入后的参数修正
1.日期转时间戮,HTML文件名,目录名更改 update cms_ecms_jdba set newstime = UNIX_TIMESTAMP(submitTime),titleurl = CON ...
- JavaBean 介绍
// Person.java public class Person{ private String name; private int age; // 无参构造函数 public Person(){ ...
- Django框架视图类
类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...
- 基于UDP的套接字、粘包问题
一.基于UDP的套接字 UDP服务端 ss = socket() #创建一个服务器的套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfro ...
- 在MySQL数据库的表中可以给某个整数类型的字段赋字符串类型的值
- Java并发—同步容器和并发容器
简述同步容器与并发容器 在Java并发编程中,经常听到同步容器.并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector.Ha ...
- RTSP客户端接收存储数据(live555库中的testRTSPClient实例)
1.testRTSPClient简介 testRTSPClient是个简单的客户端实例,这个实例对rtsp数据交互作了详细的描述,其中涉及到rtsp会话的两个概念Source和Sink. Source ...
- win7开启特定端口
win7开启特定端口 在xp系统的时代,修改防火墙很方便,很简单.windows7或许是做得过于复杂了.当然所谓安全性也是相当于其他之前版本的系统更高了.为什么要打开端口,肯定是在win ...