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个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...
随机推荐
- Sqlite文件在ubunut的查看
1. How to list the tables in a SQLite database file that was opened with ATTACH? The .tables, and .s ...
- 同一台主机部署两个比特币钱包以及rpc服务的摘要
.bitcoin QA Test环境 启动指定参数: "C:\Program Files (x86)\Bitcoin\bitcoin-qt.exe" -testnet -serve ...
- xml转化为Dictionary
代码 public SortedDictionary<string, object> FromXml(string xml) { SortedDictionary<string, o ...
- thymeleaf 格式化时间
运用Thymeleaf模板后,前台的时间显示发生变化,和数据库不一致 HTML页面中格式如下: <td th:text="${fleeceRecord.cashmereDate}&qu ...
- Java图形界面——Border
Swing编程边框(Border)的用法总结 Java进行客户端编程,使用了大量的Swing控件,由于系统默认的边框无法满足项目的要求,不得不自己更改控件的边框样式,网上找了不少资料,本文对Swing ...
- 右手坐标系下LookAt视图矩阵的推导
基本知识 右手坐标系 右手手掌弯曲,手指方向由正X轴指向正Y轴,如果这时Z轴正方向与大拇指方向保持一致,坐标系为右手坐标系,否则为左手坐标系. 向量叉乘的方向 向量(1,0,0)与向量(0,1,0)叉 ...
- (转)system.badimageformatexception 未能加载文件或程序集
“/xxxxx”应用程序中的服务器错误. ------------------------------------------------------------------------------- ...
- andorid 列表视图之SimpleAdapter
.xml <?xml version="1.0" encoding="utf-8"?> <ListView xmlns:android=&qu ...
- RabbitMQ 的基本介绍
RabbitMQ官网教程:http://www.rabbitmq.com/getstarted.html RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现.AMQP :Adv ...
- 基于稀疏表(Sparse Table)的RMQ(区间最值问题)
在RMQ的其他实现方法中,有一种叫做ST的算法比较常见. [构建] dp[i][j]表示的是从i起连续的2j个数xi,xi+1,xi+2,...xi+2j-1( 区间为[i,i+2j-1] )的最值. ...