void addedge(int fr,int to,int cap,int cos){
sid[cnt].fr=fr;sid[cnt].des=to;sid[cnt].cap=cap;sid[cnt].cos=cos;sid[cnt].next=nd[fr];nd[fr]=cnt++;
sid[cnt].fr=to;sid[cnt].des=fr;sid[cnt].cap=;sid[cnt].cos=-cos;sid[cnt].next=nd[to];nd[to]=cnt++;
} int spfa(){
dl[head=tail=]=sor;
for (int i=;i<=n+;i++) dis[i]=1e9;
for (int i=;i<=n+;i++) b[i]=;
for (int i=;i<=n+;i++) count[i]=;
b[sor]=;
dis[sor]=;
while (head<=tail){
for (int p=nd[dl[head]];p!=-;p=sid[p].next)
if ((sid[p].cap!=)&&(dis[sid[p].des]>dis[dl[head]]+sid[p].cos)){
path[sid[p].des]=p;
if (b[sid[p].des]==){
dl[++tail]=sid[p].des;
b[sid[p].des]=;
count[sid[p].des]++;
}
dis[sid[p].des]=dis[dl[head]]+sid[p].cos;
}
b[dl[head++]]=;
} if (dis[tar]==1e9) return();else return();
} void aug(){
int po=tar,flow=1e9; while (po!=sor){
int p=path[po];
flow=min(flow,sid[p].cap);
po=sid[p].fr;
} po=tar; while (po!=sor){
int p=path[po];
sid[p].cap-=flow;
ans+=flow*sid[p].cos;
sid[p^].cap+=flow;
po=sid[p].fr;
}
}

最小费用最大流

uses math;

var
n,m,i,j :longint;
ans:int64;
dl:array[..] of longint;
cost,tcap,cap:array[..,..] of int64;
dis:array[..] of longint;
pre:array[..] of longint;
a,b:array[..] of longint;
c:Array[..,..] of longint; procedure build;
var
i,j:longint;
begin
for i:= to n do
begin
cap[,i]:=maxlongint;
cost[,i]:=;
end; for i:= to n do
begin
cap[i,i+n]:=a[i];
cost[i,i+n]:=;
end; for i:= to n do
for j:= to m do
begin
cap[i+n,j+*n]:=maxlongint;
cost[i+n,j+*n]:=c[i,j];
cost[j+*n,i+n]:=-c[i,j];
end; for i:= to m do
begin
cap[i+*n,i+*n+m]:=b[i];
cost[i+*n,i+*n+m]:=;
end; for i:= to m do
begin
cap[i+*n+m,*n+*m+]:=maxlongint;
cost[i+*n+m,*n+*m+]:=;
end;
end; procedure aug;
var
po:longint;
mi:int64;
pr:longint;
begin
po:=*n+*m+;
mi:=maxlongint;
while po<> do
begin
pr:=pre[po];
mi:=min(mi,tcap[pr,po]);
po:=pr;
end; po:=*n+*m+;
while po<> do
begin
pr:=pre[po];
dec(tcap[pr,po],mi);
inc(tcap[po,pr],mi);
inc(ans,mi*cost[pr,po]);
po:=pr;
end;
end; function spfa1:boolean;
var
i,head,tail,u:longint;
begin
for i:= to *m+*n+ do
dis[i]:=maxlongint;
dis[]:=; head:=;tail:=;
dl[]:=;
while head<=tail do
begin
u:=dl[head];
for i:= to *n+*m+ do
if (tcap[u,i]>) and (dis[i]>dis[u]+cost[u,i]) then
begin
pre[i]:=u;
inc(tail);
dl[tail]:=i;
dis[i]:=dis[u]+cost[u,i];
end;
inc(head);
end; if dis[*n+*m+]=maxlongint then exit(false) else exit(true);
end; begin read(n,m); for i:= to n do
read(a[i]);
for i:= to m do
read(b[i]);
for i:= to n do
for j:= to m do
read(c[i,j]); build; for i:= to *n+*m+ do
for j:= to *n+*m+ do
tcap[i,j]:=cap[i,j];
while spfa1 do aug;
writeln(ans); end.

最大费用最大流

uses math;

var
n,m,i,j :longint;
ans:int64;
dl:array[..] of longint;
cost,tcap,cap:array[..,..] of int64;
dis:array[..] of longint;
pre:array[..] of longint;
a,b:array[..] of longint;
c:Array[..,..] of longint; procedure build;
var
i,j:longint;
begin
for i:= to n do
begin
cap[,i]:=maxlongint;
cost[,i]:=;
end; for i:= to n do
begin
cap[i,i+n]:=a[i];
cost[i,i+n]:=;
end; for i:= to n do
for j:= to m do
begin
cap[i+n,j+*n]:=maxlongint;
cost[i+n,j+*n]:=c[i,j];
cost[j+*n,i+n]:=-c[i,j];
end; for i:= to m do
begin
cap[i+*n,i+*n+m]:=b[i];
cost[i+*n,i+*n+m]:=;
end; for i:= to m do
begin
cap[i+*n+m,*n+*m+]:=maxlongint;
cost[i+*n+m,*n+*m+]:=;
end;
end; procedure aug;
var
po:longint;
mi:int64;
pr:longint;
begin
po:=*n+*m+;
mi:=maxlongint;
while po<> do
begin
pr:=pre[po];
mi:=min(mi,tcap[pr,po]);
po:=pr;
end; po:=*n+*m+;
while po<> do
begin
pr:=pre[po];
dec(tcap[pr,po],mi);
inc(tcap[po,pr],mi);
inc(ans,mi*cost[pr,po]);
po:=pr;
end;
end; function spfa2:boolean;
var
i,u,head,tail:longint;
begin
for i:= to *m+*n+ do
dis[i]:=-maxlongint;
dis[]:=; head:=;tail:=;
dl[]:=;
while head<=tail do
begin
u:=dl[head];
for i:= to *n+*m+ do
if (tcap[u,i]>) and (dis[i]<dis[u]+cost[u,i]) then
begin
pre[i]:=u;
inc(tail);
dl[tail]:=i;
dis[i]:=dis[u]+cost[u,i];
end;
inc(head);
end; if dis[*n+*m+]=-maxlongint then exit(false) else exit(true);
end; begin read(n,m); for i:= to n do
read(a[i]);
for i:= to m do
read(b[i]);
for i:= to n do
for j:= to m do
read(c[i,j]); build; ans:=;
for i:= to *n+*m+ do
for j:= to *n+*m+ do
tcap[i,j]:=cap[i,j];
while spfa2 do aug;
writeln(ans); end.

边表模板

procedure addedge(u,v,cap,cost:longint);
begin
sid[tot].u:=u;
sid[tot].v:=v;
sid[tot].cap:=cap;
sid[tot].cost:=cost;
sid[tot].next:=nd[u];
nd[u]:=tot;
inc(tot);
sid[tot].u:=v;
sid[tot].v:=u;
sid[tot].cap:=;
sid[tot].cost:=-cost;
sid[tot].next:=nd[v];
nd[v]:=tot;
inc(tot);
end; function spfa:boolean;
var
i,head,tail,u,p:longint;
begin for i:= to n+ do dis[i]:=maxlongint div ;
for i:= to n+ do vis[i]:=true; head:=;tail:=;
dl[]:=;
while head<=tail do
begin
u:=dl[head];
p:=nd[dl[head]];
while p<>- do
begin
if (sid[p].cap>) and (dis[u]+sid[p].cost<dis[sid[p].v]) then
begin
if vis[sid[p].v]=true then
begin
inc(tail);
dl[tail]:=sid[p].v;
vis[sid[p].v]:=false;
end;
pre[sid[p].v]:=p;
dis[sid[p].v]:=dis[u]+sid[p].cost;
end;
p:=sid[p].next;
end;
vis[dl[head]]:=true;
inc(head);
end; if dis[n+]=maxlongint div then exit(false) else exit(true);
end; procedure aug;
var
po,mi:longint;
begin
po:=n+;
mi:=maxlongint;
while po<> do
begin
if sid[pre[po]].cap<mi then mi:=sid[pre[po]].cap;
po:=sid[pre[po]].u;
end; po:=n+;
while po<> do
begin
inc(ans,mi*sid[pre[po]].cost);
dec(sid[pre[po]].cap,mi);
inc(sid[pre[po] xor ].cap,mi);
po:=sid[pre[po]].u;
end;
end;

-----------------------------------------------------------------------------------------

BZOJ4276

用线段树优化费用流

#include <cstdio>
#include <iostream>
using namespace std; struct edge{
int fr,des,cap,cos,next;
}sid[]; struct treenode{
int l,r,lc,rc;
}tr[]; int cnt,nd[],dl[],head,tail,sor,tar,dis[],b[],path[],ans,scnt; void addedge(int fr,int to,int cap,int cos){
sid[scnt].fr=fr;sid[scnt].des=to;sid[scnt].cap=cap;sid[scnt].cos=cos;sid[scnt].next=nd[fr];nd[fr]=scnt++;
sid[scnt].fr=to;sid[scnt].des=fr;sid[scnt].cap=;sid[scnt].cos=-cos;sid[scnt].next=nd[to];nd[to]=scnt++;
} int spfa(){
dl[head=tail=]=sor;
for (int i=;i<=tar;i++) dis[i]=,b[i]=;
b[sor]=;
dis[sor]=;
while (head<=tail){
for (int p=nd[dl[head]];p!=-;p=sid[p].next)
if ((sid[p].cap!=)&&(dis[sid[p].des]<dis[dl[head]]+sid[p].cos)){
path[sid[p].des]=p;
if (b[sid[p].des]==){
dl[++tail]=sid[p].des;
b[sid[p].des]=;
}
dis[sid[p].des]=dis[dl[head]]+sid[p].cos;
}
b[dl[head++]]=;
} if (dis[tar]==) return();else return();
} void aug(){
int po=tar,flow=1e9; while (po!=sor){
int p=path[po];
flow=min(flow,sid[p].cap);
po=sid[p].fr;
} po=tar; while (po!=sor){
int p=path[po];
sid[p].cap-=flow;
ans+=flow*sid[p].cos;
sid[p^].cap+=flow;
po=sid[p].fr;
}
} void build(int l,int r){
tr[++cnt].l=l;tr[cnt].r=r;
if (l==r) {addedge(cnt,tar,,);return;} int t=cnt,mid=(l+r)>>;
tr[t].lc=cnt+;addedge(t,cnt+,1e9,);
build(l,mid);
tr[t].rc=cnt+;addedge(t,cnt+,1e9,);
build(mid+,r);
} void query(int po,int l,int r,int fr){
if (tr[po].l==l&&tr[po].r==r){
addedge(fr,po,1e9,);return;
} int mid=(tr[po].l+tr[po].r)>>;
if (l<=mid) query(tr[po].lc,l,min(mid,r),fr);
if (r>mid) query(tr[po].rc,max(mid+,l),r,fr);
} int main(){
int n,t1,t2,t3;
scanf("%d",&n);
sor=;tar=;
for (int i=sor;i<=tar;i++) nd[i]=-;
build(,); for (int i=;i<=n;i++){
scanf("%d%d%d",&t1,&t2,&t3);t2--;
addedge(sor,++cnt,,t3);
query(,t1,t2,cnt);
} while (spfa())
aug(); printf("%d\n",ans);
}

最小/大费用最大流模板(codevs1914)的更多相关文章

  1. 洛谷P4014 分配问题【最小/大费用流】题解+AC代码

    洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的 ...

  2. 图论算法-最小费用最大流模板【EK;Dinic】

    图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...

  3. HDU3376 最小费用最大流 模板2

    Matrix Again Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)To ...

  4. 洛谷P3381 最小费用最大流模板

    https://www.luogu.org/problem/P3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...

  5. 最大流 && 最小费用最大流模板

    模板从  这里   搬运,链接博客还有很多网络流题集题解参考. 最大流模板 ( 可处理重边 ) ; const int INF = 0x3f3f3f3f; struct Edge { int from ...

  6. poj 2195 最小费用最大流模板

    /*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...

  7. Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的 ...

  8. 【网络流#2】hdu 1533 - 最小费用最大流模板题

    最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...

  9. 最小费用最大流模板 poj 2159 模板水题

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15944   Accepted: 8167 Descr ...

随机推荐

  1. iOS TabbarController 设置底部Toolbar图片和文字颜色选中样式

    提取公共方法: -(void)createChildVcWithVc:(UIViewController *)vc Title:(NSString *)title image:(NSString *) ...

  2. android canvas d

    (以下转自:http://blog.csdn.net/longyi_java/article/details/6930480) 1.基本的绘制图片方法 //Bitmap:图片对象,left:偏移左边的 ...

  3. Fragment中添加ListView而不使用ListFragment

    最初的构想是,将Fragment和ViewPager结合起来, 然后突发奇想,在第一个Fragment里添加了ListView, 依照网上的建议,extends了ListFragment,接着各种报错 ...

  4. 警惕多iframe下的同名id引起的诡异问题

    遇到个诡异bug,虽然bug中套bug,忽略次要bug,其中最诡异最典型的现象是多行window.top.$("#id")取值操作,其中有一行却取不到值.这个着实让我费解.因为用到 ...

  5. Facebook的体系结构分析---外文转载

    Facebook的体系结构分析---外文转载 From various readings and conversations I had, my understanding of Facebook's ...

  6. mysql中文乱码问题总结

    起因:此次开发工作由于电脑不能正常使用sqlserver所以改用mysql. 问题描述:mysql使用中文产生乱码 详细问题: 1.问题1:在dos界面登录数据库存入数据时如果存在中文那么不会显示. ...

  7. Vim插件管理——Vundle

    Vim插件管理--Vundle 都说Vim时程序员写给自己的编辑器,其中的情结可想而知.身为一只程序狗CodingDoge,今天就让我带各位学习Vim的使用. vim因为其庞大而强劲的插件受到无比的推 ...

  8. jsp前三章小测试:错题

    /bin:存放各种平台下用于启动和停止Tomcat的脚本文件 /logs:存放Tomcat的日志文件 /webapps:web应用的发布目录 /work:Tomcat把由JSP生成的Servlet存放 ...

  9. [IPA]IOS In App Purchase(内购)验证

    参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...

  10. VS的快捷键F12改成和ECLIPSE一样用ctrl+点击下载线

    安装resharper 插件即可 不过这个插件是收费的,可免费体验30天