POJ 2315 最小费用最大流
2014-05-08 09:26
260 查看
从1走到N然后从N走回来的最短路程是多少?转换为费用流来建模.
.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;}
/**
因为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;}
相关文章推荐
- poj 2315 最小费用最大流入门题
- poj_2315 最小费用最大流
- (最小费用最大流)POJ2516 Minimum Cost
- POJ 2135 【最小费用最大流】.cpp
- poj 3422 Kaka's Matrix Travels 最小费用最大流
- poj 2196 Going Home(最小费用最大流)
- POJ 3422Kaka's Matrix Travels(最小费用最大流)
- [poj] 3068 "Shortest" pair of paths || 最小费用最大流
- poj 2516 Minimum Cost 最小费用最大流
- The Windy's (poj 3686 最小费用最大流 建图经典)
- POJ 3422 Kaka's Matrix Travels (最小费用最大流)
- POJ 2195 Going Home(最小费用最大流)
- POJ 3422 Kaka's Matrix Travels(最小费用最大流)
- POJ 3068 "Shortest" pair of paths(最小费用最大流-mcmf)
- POJ 2516 Minimum Cost [最小费用最大流]
- POJ 2195 Going Home (最小费用最大流)
- POJ 2135 Farm Tour(最小费用最大流,变形)
- poj 2135(最小费用最大流)
- poj 2516 Minimum Cost 【最小费用最大流】
- Poj 3068 "Shortest" pair of paths【拆点+最小费用最大流】