【最小费用最大流】BZOJ1070 [SCOI2007]修车
来源:互联网 发布:萍乡教育网网络管理 编辑:程序博客网 时间:2024/05/20 02:26
题面在这里
最小费用最大流的经典题……
读题后应该就能意识到:这种资源分配型的问题一般都是网络流
然后就去想:
答案要求最短的平均时间,其实就是最短的总时间(相加)
由于求最小值,会往最小费用上面想
那么把花费的时间看做费用,流量就可以限制使得方案合法
按如下方法建图:
1. 把每个维修人员拆成N*M个点,
2. S到每个顾客建边。容量=1,费用=0
3. 每个顾客
4. 每个维修人员
主要思想就是只考虑每个顾客找谁修车,排在哪个位置对总答案的贡献
还是很经典的,不失为一道费用流好题
附上代码:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=705,maxe=144005,INF=0x3f3f3f3f;int N,M,S,T,n,tim[65][15],id[65][15],ans=0;int tot=1,son[maxe],nxt[maxe],lnk[maxn],flw[maxe],cap[maxe],w[maxe];void add(int x,int y,int z){ son[++tot]=y;nxt[tot]=lnk[x];lnk[x]=tot;flw[tot]=0;cap[tot]=1;w[tot]=z; son[++tot]=x;nxt[tot]=lnk[y];lnk[y]=tot;flw[tot]=0;cap[tot]=0;w[tot]=-z;}#define nc getcharinline int red(){ int tot=0,f=1;char ch=nc(); while (ch<'0'||'9'<ch) {if (ch=='-') f=-f;ch=nc();} while ('0'<=ch&&ch<='9') tot=tot*10+ch-48,ch=nc(); return tot*f;}int que[maxn],dst[maxn],fa[maxn],ed[maxn];bool vis[maxn];bool spfa(){ memset(dst,63,sizeof(dst)); memset(vis,0,sizeof(vis)); int hed=0,til=1; que[1]=S;dst[S]=0;fa[S]=0; while (hed!=til){ int x=que[hed=(hed+1)%maxn]; vis[x]=0; for (int j=lnk[x];j;j=nxt[j]) if (cap[j]>flw[j]&&dst[son[j]]>dst[x]+w[j]){ dst[son[j]]=dst[x]+w[j]; fa[son[j]]=x;ed[son[j]]=j; if (!vis[son[j]]) vis[son[j]]=1, que[til=(til+1)%maxn]=son[j]; } } if (dst[T]==INF) return 0; ans+=dst[T];return 1;}int main(){ M=red(),N=red(); S=maxn-2,T=maxn-1;n=N; for (int i=1;i<=N;i++) add(S,i,0); for (int i=1;i<=N;i++) for (int j=1;j<=M;j++) tim[i][j]=red(),id[i][j]=++n,add(n,T,0); for (int i=1;i<=N;i++) for (int j=1;j<=N;j++) for (int k=1;k<=M;k++) add(i,id[j][k],tim[i][k]*j); while (spfa()){ int Min=INF; for (int j=T;j!=S;j=fa[j]) Min=min(Min,cap[ed[j]]-flw[ed[j]]); for (int j=T;j!=S;j=fa[j]) flw[ed[j]]+=Min,flw[ed[j]^1]-=Min; } printf("%.2lf",(double)ans/N); return 0;}
阅读全文
2 0
- 【最小费用最大流】BZOJ1070 [SCOI2007]修车
- bzoj1070: [SCOI2007]修车(最小费用最大流)
- [BZOJ1070][SCOI2007]修车-最小费用流
- bzoj1070: [SCOI2007]修车 费用流
- [BZOJ1070]SCOI2007修车|费用流
- bzoj1070[SCOI2007]修车(费用流)
- bzoj1070: [SCOI2007]修车-费用流
- [费用流] BZOJ1070: [SCOI2007]修车
- [bzoj1070][SCOI2007]修车 费用流
- 【SCOI2007】【最小费用最大流】修车
- bzoj1070 修车 最小费用流
- BZOJ1070 / SCOI2007 修车【网络流/费用流】
- [BZOJ1070][SCOI2007]修车(费用流)
- bzoj1070 [SCOI2007]修车(费用流)
- BZOJ 最小费用流最大流 1070: [SCOI2007]修车
- SCOI2007——修车(最小费用最大流)
- 【最小费用最大流】[SCOI2007]修车 BZOJ 1070
- bzoj 1070 [SCOI2007]修车(最小费用最大流)
- android.content.res.Resources$NotFoundException: String resource ID #0x1 错误
- Opencv 角点检测的 FAST 算法
- 每日一c,对指针,数组,字符串常量之间的梳理(一)
- 最近计划
- MFC 文本框多行显示
- 【最小费用最大流】BZOJ1070 [SCOI2007]修车
- Hibernate框架
- 视频编解码概述
- HDU 2844(多重背包)
- Java并发编程与技术内幕:Callable、Future、FutureTask、CompletionService
- python3.6 使用 pymysql 连接 Mysql 数据库及 简单的增删改查操作
- 10/100M HUB级连线接法
- opencv 图像的读取显示和保存
- STL中的常用容器介绍