最小费用流算法模板
2010-11-09 22:18
120 查看
//最小费用流 //memset(head,-1,(n+2)*sizeof(int)); //en=0; struct edge{ int x,y,f,c,nxt; }e[E]; int en,head ,pre ,dist ,visited ; void add(int x,int y,int f,int c){ e[en].x=x; e[en].y=y; e[en].f=f; e[en].c=c; e[en].nxt=head[x]; head[x]=en++; } void addedge(int x,int y,int f,int c){ add(x,y,f,c); add(y,x,0,-c); } bool spfa(int s,int t,int n){ int i,v,cur; queue<int> q; for(i=0;i<n;i++){ pre[i]=-1; visited[i]=false; dist[i]=inf; } visited[s]=true; dist[s]=0; q.push(s); while(!q.empty()){ cur=q.front(); q.pop(); visited[cur]=false; for(i=head[cur];i!=-1;i=e[i].nxt) if(e[i].f){ v=e[i].y; if(dist[v]>dist[cur]+e[i].c){ dist[v]=dist[cur]+e[i].c; pre[v]=i; if(!visited[v]){ visited[v]=true; q.push(v); } } } } return dist[t]!=inf; } int cost(int s,int t,int n){ int i,flow=inf,ans=0; while(spfa(s,t,n)){ ans+=dist[t]; for(i=pre[t];i!=-1;i=pre[e[i].x]) flow=min(flow,e[i].f); for(i=pre[t];i!=-1;i=pre[e[i].x]){ e[i].f-=flow; e[i^1].f+=flow; } } return ans; }
相关文章推荐
- 最小费用流算法模板--SPFA(邻接表)
- 图像处理常用算法GPU实现三:基于模板匹配的边缘检测
- 【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器
- 第二十三模板 18.5数值算法
- 算法模板 Floyd
- 算法模板——Dinic最小费用最大流
- 矩阵模板 51nod 算法马拉松分解问题
- KMP 算法模板
- (模板)最小费用流
- 基础算法模板之链表+排序
- Ford-Fulkerson算法模板(最大流)
- 算法模板——sap网络最大流 3(递归+邻接表)
- [C++] 测试硬件popcnt(位1计数)指令与各种软件算法,利用模板实现静态多态优化性能
- DLX算法及应用(一)DLX模板+解数独
- NYOJ 题目239 月老的难题 (二分图最大匹配-匈牙利算法模板)
- 【原创】图论常用算法模板(2)
- 基于边界的模板匹配的原理及算法实现
- 网络流基础算法模板
- AtCoder Regular Contest 092 C - 2D Plane 2N Points 贪心 匈牙利算法模板
- acm算法模板(4)