int dis[N],pre[N],head[N],visit[N],yong; void init() { memset(head,-1,sizeof(head)); yong=0; } void build(int u,int v,int w,int f) { bian[yong].u=u; bian[yong].v=v; bian[yong].w=w; bian[yong].f=f; bian[yong].next=head[u]; head[u]=yong++; } void adde(int u,int v,int w,int f) { build(u,v,w,f); build(v,u,-w,0); } int spfa(int s,int t) { memset(visit,0,sizeof(visit)); memset(pre,-1,sizeof(pre)); for(int i=0;i<=t;i++)//注意是从0开始而不是从s开始 dis[i]=inf; queue<int>q; visit[s]=1;//必须是s q.push(s); dis[s]=0; while(!q.empty ()) { int u=q.front (); for(int index=head[u];index!=-1;index=bian[index].next) { int v=bian[index].v; if(bian[index].f&&dis[v]>dis[u]+bian[index].w) { dis[v]=dis[u]+bian[index].w; pre[v]=index; if(!visit[v]) { visit[v]=1; q.push (v); } } } q.pop(); visit[u]=0;//是u } if(dis[t]==inf) return -1; return dis[t]; } int min_cost(int s,int t) { int sum=0,k,i; while((k=spfa(s,t))!=-1){ int minn=inf; i=pre[t]; while(i!=-1) { if(minn>bian[i].f) minn=bian[i].f; i=pre[bian[i].u]; } sum=sum+minn*k; i=pre[t]; while(i!=-1){ bian[i].f-=minn; bian[i^1].f+=minn; i=pre[bian[i].u]; } } return sum; }
最小费用最大流邻接表模板
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:树的直径,树的重心,树的分冶
下一篇:Oracle的触发器
![](https://ucenter.51cto.com/images/noavatar_middle.gif)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
OSPF的邻居关系和邻接关系
ospf邻居与邻接
OSPF 多址 邻接关系 -
最小费用最大流——ZKW
对于最小费用最大流,我们的通常做法是EK+SPFA。...
km算法 #include 费用流 最大流 二分图