博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3254 圆桌问题
阅读量:5080 次
发布时间:2019-06-13

本文共 1422 字,大约阅读时间需要 4 分钟。

非常简单的一道网络流题

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

那么怎么输出方案呢?

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

下放代码

#include
#include
#include
#include
#define ll long long#define gc getchar#define maxn 505#define maxm 100005using 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

转载于:https://www.cnblogs.com/hanruyun/p/10630182.html

你可能感兴趣的文章
C#语法糖之 session操作类 asp.net
查看>>
2015 Multi-University Training Contest 3
查看>>
使用Gitblit 在windows 上部署你的Git Server
查看>>
217. Contains Duplicate
查看>>
vue2.0 关于Vue实例的生命周期
查看>>
jenkins 更换主数据目录
查看>>
Silverlight中恼人的g.i.cs错误
查看>>
SQLite 数据库增删改查
查看>>
<s:iterator>的status
查看>>
C++入门--1.0输入输出
查看>>
让搭建在Github Pages上的Hexo博客可以被Google搜索到
查看>>
Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段...
查看>>
在WPF控件上添加Windows窗口式调整大小行为
查看>>
背水一战 Windows 10 (36) - 控件(弹出类): ToolTip, Popup, PopupMenu
查看>>
教育类APP开发现新增长,多款APP该如何突围?
查看>>
打开3389
查看>>
React学习记录
查看>>
nginx常见内部参数,错误总结
查看>>
对象与类
查看>>
《奸的好人2》财色战场----笔记
查看>>