问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于最小费用最大流

发布网友 发布时间:2022-05-21 20:59

我来回答

3个回答

热心网友 时间:2023-11-11 16:26

const
maxn=100;
maxq=100000;

var
p,c,f:array[1..maxn,1..maxn] of longint;
dist,path:array[1..maxn] of longint;
q:array[1..maxq] of longint;
check:array[1..maxn] of 0..1;
n,m:longint;
mark:boolean;

procere init;
var
s,t,r,w,i,j:longint;
begin
readln (n);
readln (m);
for i:=1 to m do begin
readln (s,t,r,w);
c[s,t]:=r;p[s,t]:=w;
end;
end;

procere main;
var
i,j,a,r,l,k:longint;
begin
fillchar(f,sizeof(f),0);
mark:=true;
while mark do begin
q[1]:=1;r:=0;l:=1;
mark:=false;
for i:=2 to n do dist[i]:=maxlongint;
fillchar(check,sizeof(check),0);dist[1]:=0;
fillchar(path,sizeof(path),0);
while r<l do begin
inc(r);
for i:=2 to n do if (c[i,q[r]]<>0) or (c[q[r],i]<>0) then begin
if (c[q[r],i]<>0) and (f[q[r],i]<c[q[r],i]) and (dist[q[r]]+p[q[r],i]<dist[i]) then begin
dist[i]:=dist[q[r]]+p[q[r],i];
path[i]:=q[r];
if check[i]=0 then begin inc(l);q[l]:=i;check[i]:=1;end;
end;
if (c[i,q[r]]<>0) and (f[i,q[r]]<>0) and (dist[q[r]]-p[i,q[r]]<dist[i]) then begin
dist[i]:=dist[q[r]]-p[i,q[r]];
path[i]:=-q[r];
if check[i]=0 then begin inc(l);q[l]:=i;check[i]:=1;end;
end;
end;
check[q[r]]:=0;
end;
if path[n]<>0 then begin
mark:=true;
l:=n;a:=maxlongint;
while l<>1 do begin
k:=abs(path[l]);
if path[l]>0 then begin
if c[k,l]-f[k,l]<a then a:=c[k,l]-f[k,l];
end
else begin
if f[l,k]<a then a:=f[l,k];
end;
l:=k;
end;
l:=n;
while l<>1 do begin
k:=abs(path[l]);
if path[l]>0 then inc(f[k,l],a)
else dec(f[l,k],a);
l:=k;
end;
end;
end;
end;

procere print;
var
i,j,s:longint;
begin
s:=0;for i:=1 to n-1 do inc(s,f[i,n]);
writeln (s);
s:=0;
for i:=1 to n do
for j:=1 to n do inc(s,f[i,j]*p[i,j]);
writeln (s);
end;

begin
init;
main;
print;
end.

最小费用最大流。

你的好长啊。···

把程序看懂后自己可以化嘛。
我暂时找不到用边存储的题目。 化为边后不小心错了也有可能。

热心网友 时间:2023-11-11 16:27

/*
ID: linjd821
LANG: C++
TASK: http://acm.pku.e.cn/JudgeOnline/problem?id=3422 Kaka's Matrix Travels
*/
/*
算法说明:最小费用最大流
输入:链接表图edge[]+head[], 点个数N,源点src, 汇点dest
输出:ans = 最小费用最大流
代码参考:谢政《网络算法与复杂性理论》网上应该也有英文版的论文,我这个是
连续最短路增广算法(successive shortest path)简称SSP,
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <ctype.h>
#include <map>
#include <string>
#include <set>
#include <bitset>
#include <utility>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <iostream>
#include <fstream>
#include <list>

using namespace std;

const int MAXN = 5000+10;
const int MAXM = 50000;
const int INF = 1000000000;

struct Edge
{
int next;
int st, ed;
int flow;
int cost;
}edge[MAXM];
int head[MAXN];

int N, K, E, src, dest;
int g[55][55];
int d[MAXN], pre[MAXN];

inline void add_edge(int u, int v, int flow, int cost)
{
edge[E].st = u;
edge[E].ed = v;
edge[E].flow = flow;
edge[E].cost = cost;
edge[E].next = head[u];
head[u] = E++;

edge[E].st = v;
edge[E].ed = u;
edge[E].flow = 0;
edge[E].cost = -cost;
edge[E].next = head[v];
head[v] = E++;
}

//for every node i add_edge i-->i' flow = 1; cost = g[i][j]
//for every path i to j add_edge i'-->j flow = INF; cost = 0;
void BuildGraph()
{
int i, j, u;
for(i = 1; i <= N; i++)
for(j = 1; j <= N; j++)
scanf("%d", &g[i][j]);
memset(head, -1, sizeof(head));
E = 0;
for(i = 1; i <= N; i++)
for(j = 1; j <= N; j++)
{
add_edge((i-1)*N+j, (i-1)*N+j+N*N, 1, -g[i][j]);
if(i != N)
{
add_edge((i-1)*N+j+N*N, i*N+j, INF, 0);
add_edge((i-1)*N+j, i*N+j, INF, 0);
}
if(j != N)
{
add_edge((i-1)*N+j+N*N, (i-1)*N+j+1, INF, 0);
add_edge((i-1)*N+j, (i-1)*N+j+1, INF, 0);
}
if(i == N || (i == N-1 && j == N))
{
add_edge((i-1)*N+j, 2*N*N, INF, 0);
}
}
add_edge(0, 1, K, 0);
src = 0;
N = N*N*2;
dest = N;
}

int SPFA()
{
int que[MAXN][2], rear = 1, front = 0, i, aug = INF;
bool used[MAXN];
memset(used, 0, sizeof(used));
for(i = 0; i <= N; i++)
d[i] = INF;
que[0][0] = src;
que[0][1] = INF;
d[src] = 0;

while(rear != front)
{
int cur = que[front][0];
int cp = que[front][1];
//printf("cur = %d, cp = %d, d[%d] = %d\n", cur, cp, cur, d[cur]);
if(cur == dest) aug = cp;
front = (front+1)%MAXN;
used[cur] = false;
for(i = head[cur]; i != -1; i = edge[i].next)
{
if(edge[i].flow && d[edge[i].ed] > d[cur]+edge[i].cost)
{
d[edge[i].ed] = d[cur]+edge[i].cost;
pre[edge[i].ed] = i;
if(!used[edge[i].ed])
{
used[edge[i].ed] = true;
que[rear][0] = edge[i].ed;
que[rear][1] = min(cp, edge[i].flow);
rear = (rear+1)%MAXN;
}
}
}
}
return aug == INF ? 0 : aug;
}

int MinCostFlow()
{
int i, ans = 0, t;
while((t = SPFA()))
{
ans -= d[dest]*t;
int ptr = dest;
while(ptr != src)
{
ptr = pre[ptr];
edge[ptr].flow -= t;
edge[ptr^1].flow += t;
ptr = edge[ptr].st;
}
}
return ans;
}
int main()
{
while(scanf("%d %d", &N, &K) != EOF)
{
BuildGraph();
printf("%d\n", MinCostFlow());
}
return 0;
}

参考资料:http://blog.csdn.net/soberman/archive/2009/03/09/3974869.aspx

热心网友 时间:2023-11-11 16:27

ID: linjd821
LANG: C++
TASK: http://acm.pku.e.cn/JudgeOnline/problem?id=3422 Kaka's Matrix Travels
*/
/*
算法说明:最小费用最大流
输入:链接表图edge[]+head[], 点个数N,源点src, 汇点dest
输出:ans = 最小费用最大流
代码参考:谢政《网络算法与复杂性理论》网上应该也有英文版的论文,我这个是
连续最短路增广算法(successive shortest path)简称SSP,
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <ctype.h>
#include <map>
#include <string>
#include <set>
#include <bitset>
#include <utility>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <iostream>
#include <fstream>
#include <list>

using namespace std;

const int MAXN = 5000+10;
const int MAXM = 50000;
const int INF = 1000000000;

struct Edge
{
int next;
int st, ed;
int flow;
int cost;
}edge[MAXM];
int head[MAXN];

int N, K, E, src, dest;
int g[55][55];
int d[MAXN], pre[MAXN];

inline void add_edge(int u, int v, int flow, int cost)
{
edge[E].st = u;
edge[E].ed = v;
edge[E].flow = flow;
edge[E].cost = cost;
edge[E].next = head[u];
head[u] = E++;

edge[E].st = v;
edge[E].ed = u;
edge[E].flow = 0;
edge[E].cost = -cost;
edge[E].next = head[v];
head[v] = E++;
}

//for every node i add_edge i-->i' flow = 1; cost = g[i][j]
//for every path i to j add_edge i'-->j flow = INF; cost = 0;
void BuildGraph()
{
int i, j, u;
for(i = 1; i <= N; i++)
for(j = 1; j <= N; j++)
scanf("%d", &g[i][j]);
memset(head, -1, sizeof(head));
E = 0;
for(i = 1; i <= N; i++)
for(j = 1; j <= N; j++)
{
add_edge((i-1)*N+j, (i-1)*N+j+N*N, 1, -g[i][j]);
if(i != N)
{
add_edge((i-1)*N+j+N*N, i*N+j, INF, 0);
add_edge((i-1)*N+j, i*N+j, INF, 0);
}
if(j != N)
{
add_edge((i-1)*N+j+N*N, (i-1)*N+j+1, INF, 0);
add_edge((i-1)*N+j, (i-1)*N+j+1, INF, 0);
}
if(i == N || (i == N-1 && j == N))
{
add_edge((i-1)*N+j, 2*N*N, INF, 0);
}
}
add_edge(0, 1, K, 0);
src = 0;
N = N*N*2;
dest = N;
}

int SPFA()
{
int que[MAXN][2], rear = 1, front = 0, i, aug = INF;
bool used[MAXN];
memset(used, 0, sizeof(used));
for(i = 0; i <= N; i++)
d[i] = INF;
que[0][0] = src;
que[0][1] = INF;
d[src] = 0;

while(rear != front)
{
int cur = que[front][0];
int cp = que[front][1];
//printf("cur = %d, cp = %d, d[%d] = %d\n", cur, cp, cur, d[cur]);
if(cur == dest) aug = cp;
front = (front+1)%MAXN;
used[cur] = false;
for(i = head[cur]; i != -1; i = edge[i].next)
{
if(edge[i].flow && d[edge[i].ed] > d[cur]+edge[i].cost)
{
d[edge[i].ed] = d[cur]+edge[i].cost;
pre[edge[i].ed] = i;
if(!used[edge[i].ed])
{
used[edge[i].ed] = true;
que[rear][0] = edge[i].ed;
que[rear][1] = min(cp, edge[i].flow);
rear = (rear+1)%MAXN;
}
}
}
}
return aug == INF ? 0 : aug;
}

int MinCostFlow()
{
int i, ans = 0, t;
while((t = SPFA()))
{
ans -= d[dest]*t;
int ptr = dest;
while(ptr != src)
{
ptr = pre[ptr];
edge[ptr].flow -= t;
edge[ptr^1].flow += t;
ptr = edge[ptr].st;
}
}
return ans;
}
int main()
{
while(scanf("%d %d", &N, &K) != EOF)
{
BuildGraph();
printf("%d\n", MinCostFlow());
}
return 0;
}

参考资料: http://blog.csdn.net/soberman/archive/2009/03/09/3974869.aspx
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在RLC电路中,谐振频率为___同期为___谐振条件为___? 电磁振荡并联 RLC振荡回路的谐振频率与振荡特性 佛手柑水培还是干放 中山市美派电器有限公司怎么样? 成都美派电器有限公司怎么样? 两条不同品牌的DDR3内存条可以一起用吗 驾驶证的牡丹卡多长时间能办下来 新衣服必须用洗衣液洗才能去甲醛吗? 梦见逛街被偷抢 2024年买什么品牌的运动男鞋比较好? 妙笔生花汉化版可以随时随地的设计草图,完败PhotoShop,美图秀秀等手机图像处理软件,安卓版可 foobar2000安卓版相信有这款播放软件的都是音乐爱好者我也这其中一个但小弟不才怎么也找不到安卓版下载包 【安卓1.5软件,安卓1.5软件下载】 这是什么软件求安卓版下载链接 手机上怎样办理中信银行信用卡取现业务的? 如何确定中学教学目的 如何确立一课的教学目标 中村优一拍过哪些电视剧啊(最好說下時間)謝謝~ 这是哪一动漫人物 很多古人的作品让我们陶醉于当时明月清风竹林柏崎茜 填报志愿,滑档问题 连接电视派上面显示电视机不在线是什么意思? 浙江二批滑档怎么办?又不想读专科。 电视创维55E361S 连上无线网多媒体就会弹出二维码提示连接电视派软件,但电视派用不了了怎么办? 我家的创维电视不能用电视派连接了? 浙江高考普通类第二段什么意思 电视派怎么连结不了创维电视了列'老是要电视ⅠD连结,我的创维电视在网上买的ID在哪查? 浙江省二模分数线 酷开电视派的设备连不上WiFi怎么办 电视机播放电视派投送的视频为什么老是播放失败? 云南大诚投资有限公司怎么样? 云南辰宇投资有限公司怎么样? 云南善赢投资有限公司怎么样? 云南世强投资有限公司怎么样? 云南卡昂投资有限公司怎么样? 云南欧泰投资有限公司怎么样? 云南杰地投资有限公司怎么样? 云南其利投资有限公司怎么样? 北大校徽是鲁迅设计的,鲁迅和北大有什么关联? 鹅肝是怎样炼成的? 鹅肝是怎么养出来的? 鹅肥肝是怎么培育出来的? 请问用菊花沏的茶 茶水显酸性还是碱性? 菊花属于碱性食物还是酸性食物??? 欧洲的鹅肝是从哪里来的?一般什么鹅 决明子,贡菊花,金银花,枸杞是酸性还是碱性? 菊花茶是酸的吗? 可乐和菊花茶混合后,有什么副作用? 为什么吃了螺旋藻,大便会变得次数多而且粘稠 为什么我吃了螺旋藻不上厕所,放屁还多了。。。