MCMF文档格式.docx
- 文档编号:15915300
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:8
- 大小:16.86KB
MCMF文档格式.docx
《MCMF文档格式.docx》由会员分享,可在线阅读,更多相关《MCMF文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
基于邻接表的源码:
voidSPFA(){
for(inti=1;
i<
=gv;
i++)
Dist[i]=100000;
Dist[S]=0;
intclosed=0,open=1;
queue[1]=S;
Inqueue[S]=true;
do{
closed++;
node*tmp=connect[queue[closed]];
Inqueue[queue[closed]]=false;
while(tmp!
=NULL){
if(Dist[tmp->
key]>
Dist[queue[closed]]+tmp->
w){
Dist[tmp->
key]=Dist[queue[closed]]+tmp->
w;
Path[tmp->
key]=queue[closed];
if(!
Inqueue[tmp->
key]){
Inqueue[tmp->
key]=true;
open++;
queue[open]=tmp->
key;
}
tmp=tmp->
next;
}while(closed<
open);
}
基于邻接矩阵的源码:
for(inti=1;
i++){
for(intj=1;
j<
j++)
Graph[i][j]&
&
i!
=j)Graph[i][j]=100000;
intu=queue[closed];
Inqueue[u]=false;
if(Dist[i]>
Dist[u]+Graph[u][i]){
Dist[i]=Dist[u]+Graph[u][i];
Path[i]=u;
Inqueue[i]){
Inqueue[i]=true;
queue[open]=i;
2)、MCMF(MinimumCostMaximunFlow)
#include<
iostream>
string.h>
queue>
stdio.h>
algorithm>
usingnamespacestd;
constintinf=1<
<
30;
intdemands[55][55];
intsupply[55][55];
intmoney[55][55][55];
intcost[105][105];
intflow[105][105];
intcap[105][105];
intd[105];
intp[105];
intsum[55];
inttotal[55];
boolused[105];
intm,n,c;
intMIN(inta,intb)
{
if(a>
b)
returnb;
returna;
voidSPFA(ints)
intu,v,t=n+m+1;
queue<
int>
q;
memset(used,0,sizeof(used));
memset(p,-1,sizeof(p));
for(u=0;
u<
=t;
u++)
d[u]=inf;
d[s]=0;
q.push(s);
used[s]=true;
while(!
q.empty())
{
u=q.front();
q.pop();
used[u]=false;
for(v=0;
v<
v++)
if(cap[u][v]>
flow[u][v]&
d[v]>
d[u]+cost[u][v])
d[v]=d[u]+cost[u][v];
p[v]=u;
if(!
used[v])
used[v]=true;
q.push(v);
voidMCMF(ints,intt)
inta,u;
memset(flow,0,sizeof(flow));
c=0;
while
(1)
SPFA(s);
if(p[t]==-1)
break;
a=inf;
u=t;
while(p[u]!
=-1)
a=MIN(a,cap[p[u]][u]-flow[p[u]][u]);
u=p[u];
flow[p[u]][u]+=a;
flow[u][p[u]]-=a;
c+=d[t]*a;
intmain()
inti,j,k,t,ans,kind,temp;
boolflag;
while(scanf("
%d%d%d"
&
n,&
m,&
kind)!
=EOF)
if(n==0&
m==0&
kind==0)
memset(sum,0,sizeof(sum));
memset(total,0,sizeof(total));
flag=true;
i<
=n;
i++)
for(intj=1;
j<
=kind;
j++)
scanf("
%d"
demands[i][j]);
sum[j]+=demands[i][j];
=m;
supply[i][j]);
total[j]+=supply[i][j];
for(intk=1;
k<
k++)
money[k][i][j]);
for(intk=1;
{
if(total[k]<
sum[k])
{
printf("
-1\n"
);
flag=false;
break;
}
}
if(!
flag)
continue;
t=m+n+1;
ans=0;
memset(cap,0,sizeof(cap));
memset(cost,0,sizeof(cost));
for(inti=1;
for(intj=1;
{
cap[i][j+m]=supply[i][k];
cost[i][j+m]=money[k][j][i];
cost[j+m][i]=-cost[i][j+m];
}
cap[0][i]=supply[i][k];
cap[i+m][t]=demands[i][k];
MCMF(0,t);
ans+=c;
printf("
%d\n"
ans);
return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MCMF