HDU5619 (费用流)
2024-10-18 02:12:58
Problem Jam's Store (HDU5619)
题目大意
有m个服务员,和n个顾客,给出每个服务员招待每个顾客的时间,每个服务员在同一时间只能服务一个顾客,询问所有顾客完成服务的最少时间。
解题分析
第一反应就是用费用流来做。
题目难度在于每个服务员在同一时间只能服务一个顾客。考虑把每个服务员拆成n个点,表示服务员的服务顺序。
若第i个顾客是第j个服务员的倒数第k个服务对象,那么对答案的贡献为V[i,j]*k (使k-1个顾客等待了V[i,j]的时间)
因此由S向每个顾客连一条(1,0)的边,第i个顾客向第j个服务员的第k个点连一条(1,v[i,j]*k)的边,每个服务员的n个点向T’连一条(1,0)的边,T'向T连一条(n,0)的边。
参考程序
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std; #define V 1008
#define E 1000008
#define INF 200000000
int n,m,S,T,Que; int pd[V],dis[V],pre[V];
struct line{
int u,v,c,w,nt;
}eg[E];
int lt[V],sum; void adt(int u,int v,int c,int w) {
eg[++sum].u=u; eg[sum].v=v; eg[sum].c=c;
eg[sum].w=w; eg[sum].nt=lt[u]; lt[u]=sum;
} void add(int u,int v,int c,int w) {
adt(u,v,c,w); adt(v,u,,-w);
//printf("%d %d %d %d\n",u,v,c,w);
} void init(){ sum=;
memset(lt,,sizeof(lt));
scanf("%d%d",&m,&n);
S = ; T = (m+)*n+;
for (int i=;i<=n;i++) add(S,i,,);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) {
int x;
scanf("%d",&x);
for (int k=;k<=n;k++)
add(i,j*n+k,,k*x);
}
for (int i=n+;i<=(m+)*n;i++)
add(i,T-,,);
add(T-,T,n,);
n=T;
} bool spfa() {
queue <int> Q;
for (int i=;i<=n;i++) {
dis[i]=INF;
pd[i]=;
pre[i]=-;
}
dis[S]=; pd[S]=; Q.push(S);
while (!Q.empty()) {
int u = Q.front();
for (int i=lt[u];i;i=eg[i].nt)
if (eg[i].c>) {
int v=eg[i].v;
if (dis[u]+eg[i].w<dis[v]) {
dis[v]=dis[u]+eg[i].w;
pre[v]=i;
if (!pd[v]) {
Q.push(v);
pd[v]=;
}
}
}
pd[u]=;
Q.pop();
}
return dis[T]!=INF;
} void minCmaxF(){
int minC=,maxF=,flow;
while (spfa()) {
flow=INF;
for (int i=pre[T];~i;i=pre[eg[i].u])
flow=min(flow,eg[i].c);
for (int i=pre[T];~i;i=pre[eg[i].u]) {
eg[i].c-=flow;
eg[i^].c+=flow;
}
maxF+=flow;
minC+=flow*dis[T];
}
printf("%d\n",minC); } int main(){
scanf("%d",&Que);
while (Que--) {
init();
minCmaxF();
}
}
最新文章
- 使用Notepad++作为IDE代替Source Insight
- Oracle SQL基本操作
- iATKOS&#160;v7硬盘安装教程(硬盘助手+变色龙安装版)
- IIS WebForm开发基础
- wordpress修改固定链接及修改链接后链接提示404错误的解决办法
- mercurial(hg)使用
- ArcGIS AO开发高亮显示某些要素
- Newtonsoft.Json随手记
- python(一)入门
- Linux上安装KDE, Gnome和VNC
- lucene建立索引的过程
- CM3存储器系统
- BNU OJ 51003 BQG&#39;s Confusing Sequence
- 使用批处理根据项目工程文件生成Nuget包并发布(支持.NET Core)
- PHP流程管理,堪比小小程序
- [codeforces167B]Wizards and Huge Prize
- 201521123069 《Java程序设计》 第13周学习总结
- C#之FileInfo的简单操作
- day1.接口测试(概念、Postman、SoapUI、jmeter)
- 深入理解Java虚拟机读书笔记5----虚拟机字节码执行引擎
热门文章
- struts2视频学习笔记 03-06(Struts 2配置文件无提示问题,Action配置中的各项默认值,各种转发类型)
- 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据
- php header setcookie headers_sent函数 函数检查 HTTP 标头是否已被发送以及在哪里被发送
- android 定制目录
- [转]iOS/iphone开发如何为苹果开发者帐号APPID续费
- OpenLDAP使用疑惑解答及使用Java完成LDAP身份认证
- 第三章 XHTML 表单
- 枚举IoTimer
- 各种常用函数 (SQL)
- Achieving High Availability and Scalability - ARR and NLB