您的位置:首页 > 其它

POJ 2315 最小费用最大流

2014-05-08 09:26 260 查看
从1走到N然后从N走回来的最短路程是多少?转换为费用流来建模.
/**
因为e==0所以pe[v]pe[v]^1是两条相对应的边
E[pe[v]].c-=aug;E[pe[v]^1].c+=aug;
*/
#include<queue>
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<map>
usingnamespacestd;
#defineV30010//vertex
#defineE150010//edge
#defineINF0x3F3F3F3F
structMinCostMaxFlow
{
structEdge
{
intv,next,cap,cost;//cap为容量,cost为单位流量费用
}edge[E];
inthead[V],pe[V],pv[V];//每个节点的第一条edge[idx]的编号.
intdis[V];//theshortestpathtothesrc
boolvis[V];//visted
//pe[v]存放在增广路上到达v的边(u,v)在edge[]的位置
//pv[u]存放在增广路上从u出发的边(u,v)在edge[]中的位置
inte,src,sink;//theindexoftheedge
voidaddedge(intu,intv,intcap,intcost)
{
edge[e].v=v,edge[e].cap=cap;
edge[e].cost=cost,edge[e].next=head[u],head[u]=e++;
edge[e].v=u,edge[e].cap=0;
edge[e].cost=-1*cost,edge[e].next=head[v],head[v]=e++;
}
//求最短路,不存在负环的时候,比DFS快
intSPFABFS()
{
memset(vis,0,sizeof(vis));
memset(pv,-1,sizeof(pv));
for(inti=0;i<V;i++)dis[i]=INF;
queue<int>Q;
Q.push(src),vis[src]=1,dis[src]=0;
while(!Q.empty())
{
intu=Q.front();
Q.pop(),vis[u]=0;
for(inti=head[u];i!=-1;i=edge[i].next)
{
intv=edge[i].v;
if(edge[i].cap>0&&dis[v]>dis[u]+edge[i].cost)
{
dis[v]=dis[u]+edge[i].cost;
if(!vis[v])Q.push(v),vis[v]=1;
pv[v]=u,pe[v]=i;
}
}
}
if(dis[sink]==INF)return-2;//can'tfromsrctosink.
returndis[sink];
}
pair<int,int>MCMF()
{
intmaxflow=0,mincost=0;
while(SPFABFS())
{
if(pv[sink]==-1)break;
intaug=INF;
for(inti=sink;i!=src;i=pv[i])
aug=min(aug,edge[pe[i]].cap);
maxflow+=aug;
mincost+=aug*dis[sink];
for(inti=sink;i!=src;i=pv[i])
{
edge[pe[i]].cap-=aug;
edge[pe[i]^1].cap+=aug;
}
}
returnmake_pair(maxflow,mincost);
}
///一定需要初始化的是src,sink
voidsolve()
{
intN,M;
while(scanf("%d%d",&N,&M)!=EOF)
{
e=0;
memset(head,-1,sizeof(head));
for(inti=0;i<M;i++)
{
inta,b,c;
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,1,c);
addedge(b,a,1,c);
}
src=0;
sink=N+1;
addedge(src,1,2,0);
addedge(N,sink,2,0);
pair<int,int>ret=MCMF();
cout<<ret.second<<endl;
}
}
}mcmf;
intmain()
{
mcmf.solve();
return0;
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: