bzoj2879(动态加边费用流)
参考题解:http://blog.csdn.net/yxuanwkeith/article/details/52254602
//开始跑费用流用的dijkstra,一直错,后来发现动态加边后我不会处理势函数;
//因为加进一些边后1号点到某个点的最短路不好更新,有些点是有势函数的,有些没有,图不平衡了;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=;
int head,tail,q[maxn],H[maxn],last[maxn],inf,All,S,T,n,m,Min,t[][],vis[maxn],dis[maxn],in[maxn],p[],cnt;
struct edg{
int nxt,to,f,c;
}e[maxn*];
void insert(int x,int y,int z,int zz){
++cnt;e[cnt].nxt=last[x];last[x]=cnt;e[cnt].to=y;e[cnt].f=z;e[cnt].c=zz;
}
void add(int x,int k){
//加第x个厨师的第k组边
int u=(x-)*All+k;
if(k>All||vis[u])return;
vis[u]=;
insert(S,u,,);insert(u,S,,);
for(int i=;i<=n;++i)
{insert(u,All*m+i,,t[i][x]*k);insert(All*m+i,u,,-t[i][x]*k);}
}
int dfs(int x,int h){
if(x==T){Min+=dis[T]*h;return h;}
int tmp=,cp;in[x]=;
for(int i=last[x];i;i=e[i].nxt){
int v=e[i].to;
if(dis[v]==dis[x]+e[i].c&&e[i].f&&!in[v]){
cp=dfs(v,min(h-tmp,e[i].f));
e[i].f-=cp;e[i^].f+=cp;tmp+=cp;
if(tmp==h){//动态加边:当前点跑满流了就新加边;
//注意加边的顺序,先加费用小的;
if(x<=All*m&&x!=S)add((x-)/All+,(x-)%All+);
return tmp;
}
}
}
return tmp;
}
void solve(){
while(){
memset(in,,sizeof(in));memset(dis,,sizeof(dis));
inf=dis[];dis[S]=;head=tail=;
q[++tail]=S;
while(head!=tail){
head=(head+)%maxn;
int u=q[head];
for(int i=last[u];i;i=e[i].nxt){
int v=e[i].to;
if(e[i].f&&dis[v]>dis[u]+e[i].c){
dis[v]=dis[u]+e[i].c;
if(!in[v]){
in[v]=;tail=(tail+)%maxn;
q[tail]=v;
}
}
}
in[u]=;
}
if(dis[T]==inf)return;
dfs(S,inf);
}
}
int main(){
cin>>n>>m;
for(int i=;i<=n;++i){
scanf("%d",&p[i]);All+=p[i];
}
S=,T=m*All+n+;
cnt=;
for(int i=;i<=n;++i){
insert(All*m+i,T,p[i],);
insert(T,All*m+i,,);
for(int j=;j<=m;++j)scanf("%d",&t[i][j]);
}
for(int i=;i<=m;++i)add(i,);
solve();
cout<<Min;
system("pause");
return ;
}
bzoj2879(动态加边费用流)的更多相关文章
- 【bzoj2597】[Wc2007]剪刀石头布 动态加边费用流
题目描述 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况.有的时候,无聊的人们会津津乐道于统计有多少这 ...
- 【bzoj2879】[Noi2012]美食节 费用流+动态加边
原文地址:http://www.cnblogs.com/GXZlegend 题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他 ...
- [BZOJ2879][Noi2012]美食节(费用流)
题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...
- BZOJ2879 [Noi2012]美食节 【费用流】
题目 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都很可 ...
- Codeforces 708D 上下界费用流
给你一个网络流的图 图中可能会有流量不平衡和流量>容量的情况存在 每调整一单位的流量/容量 需要一个单位的花费 问最少需要多少花费使得原图调整为正确(可行)的网络流 设当前边信息为(u,v,f, ...
- [BZOJ2879] [Noi2012] 美食节 (费用流 & 动态加边)
Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...
- [NOI2012][bzoj2879] 美食节 [费用流+动态加边]
题面 传送门 思路 先看看这道题 修车 仔细理解一下,这两道题是不是一样的? 这道题的不同之处 但是有一个区别:本题中每一种车有多个需求,但是这个好办,连边的时候容量涨成$p\lbrack i\rbr ...
- 【BZOJ-2879】美食节 最小费用最大流 + 动态建图
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1366 Solved: 737[Submit][Status] ...
- [NOI2012]美食节——费用流(带权二分图匹配)+动态加边
题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...
随机推荐
- 比特币学习-Transaction的locktime属性
Locktime, also known as nLockTime from the variable name used in the reference client, defines the e ...
- Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"
https://blog.csdn.net/saucyj/article/details/79043443
- c# Parallel.For 并行编程 执行顺序测试
因为有个for 实际执行结果尽管是按照for里边的顺序执行,但处理器让哪个分线程先执行,谁先处理完就不一定了. 对于要求结果需要先后顺序的,比如对text内容的操作, 用并行 Parallel.For ...
- java 字符串截取类 区分中文、英文、数字、标点符号
package com.founder.fix.ims; /** * @author WANGYUTAO * 操作字符串 */ public class SubString { // public s ...
- Android.HowToDesignPluginArchitectureInAndroidApp
There is a tools called "dx", this tool can transfer Java Binary Code into Android Dalvik ...
- 单细胞RNA测序技术之入门指南
单细胞RNA测序技术之入门指南 [字体: 大 中 小 ] 时间:2018年09月12日 来源:生物通 编辑推荐: 在这个飞速发展的测序时代,DNA和RNA测序已经逐渐成为“实验室中的家常菜”.若要 ...
- [转]slf4j 与log4j 日志管理
log4j简易入门 package test.log4j; import org.apache.log4j.Logger; public class HelloLog4j { private stat ...
- 适合新手小白的UI学习路线完整版
UI设计是很多年轻人活着想转行学习的人的新职业目标,越来越多的人看到UI设计良好的就业发展前景,纷纷投入到UI设计的大军中来,想学习UI设计,很多小白并不知道从何开始学起,用什么样的方法去学习,所以今 ...
- virtualbox 采用 NAT 还是 BRIDGE
正如标题所言,其实这两个都可以让虚拟机上网,但是还是有些差别的. 选择NAT的话, 虚拟机之间无法PING通 虚拟机可以PING通主机 主机无法PING通虚拟机 这是因为虚拟机不能在网络里拥有自己的I ...
- service fabric重装电脑后集群失败
前提.下载service fabric sdk工具 1.Remote Procedure Call (RPC)服务打开 自动 2.Remote Procedure Call (RPC) Locator ...