Spfa费用流模板
2016-02-27 11:39
387 查看
const int INF=1000000000; const int maxn=1010,maxm=400010; int cnt=1,fir[maxn],nxt[maxm],to[maxm]; int cap[maxm],val[maxm],dis[maxn],path[maxn]; void add(int a,int b,int c,int v){ nxt[++cnt]=fir[a];to[cnt]=b; cap[cnt]=c;val[cnt]=v;fir[a]=cnt; } void addedge(int a,int b,int c,int v){ add(a,b,c,v); add(b,a,0,-v); } int S,T; int vis[maxn]; int Spfa(){ deque<int>q; memset(dis,127,sizeof(dis)); memset(vis,0,sizeof(vis)); q.push_front(S); dis[S]=0;vis[S]=1; while(!q.empty()){ int x=q.front();q.pop_front();vis[x]=0; for(int i=fir[x];i;i=nxt[i]) if(cap[i]&&dis[x]+val[i]<dis[to[i]]){ dis[to[i]]=val[i]+dis[x]; path[to[i]]=i; if(vis[to[i]])continue; if(dis[to[i]]<dis[x]) q.push_front(to[i]); else q.push_back(to[i]); vis[to[i]]=1; } } return dis[T]==dis[T+1]?0:dis[T]; } int Aug(){ int p=T,f=INF; while(p!=S){ f=min(f,cap[path[p]]); p=to[path[p]^1]; } p=T; while(p!=S){ cap[path[p]]-=f; cap[path[p]^1]+=f; p=to[path[p]^1]; } return f; } int MCMF(){ int ret=0,d; while(d=Spfa()) ret+=Aug()*d; return ret; }
#include <queue> using namespace std; const int maxn=2010; const int maxm=500010; const int INF=1061109567; int n,m,w[maxn],cnt,fir[maxn],to[maxm],nxt[maxm]; int cap[maxm],val[maxm],path[maxn],vis[maxn],dis[maxn]; queue<int>q; struct Net_Flow{ Net_Flow(){cnt=1;} void add(int a,int b,int c,int v){ nxt[++cnt]=fir[a];cap[cnt]=c; to[cnt]=b;val[cnt]=v;fir[a]=cnt; } void addedge(int a,int b,int c,int v){ add(a,b,c,v);add(b,a,0,-v); } int Spfa(int S,int T){ memset(dis,63,sizeof(dis)); q.push(S);vis[S]=1;dis[S]=0; while(!q.empty()){ int x=q.front();q.pop();vis[x]=0; for(int i=fir[x];i;i=nxt[i]) if(cap[i]&&dis[to[i]]>dis[x]+val[i]){ dis[to[i]]=dis[x]+val[i]; if(!vis[to[i]])q.push(to[i]); vis[to[i]]=1;path[to[i]]=i; } } return dis[T]; } int Aug(int S,int T){ int p=T,f=INF; while(p!=S){ f=min(f,cap[path[p]]); p=to[path[p]^1]; }p=T; while(p!=S){ cap[path[p]]-=f; cap[path[p]^1]+=f; p=to[path[p]^1]; } return f; } int MCMF(int S,int T){ int v=0,d; while((d=Spfa(S,T))!=INF) v+=d*Aug(S,T); return v; } }mcmf;
相关文章推荐
- QtMultiMedia 之 CameraFocus
- MySQL追加注释或者大量修改注释
- localStorage
- jquery checkbox勾选/取消勾选的诡异问题
- QtMultiMedia 之 CameraImageProcessing
- IE8 jquery ajax获取静态资源报错TypeError 拒绝访问
- VNC Viewer连接后闪退
- HttpClient 和 HttpUrlConnection 区别
- Touch ID简单使用
- Angular2教程(二)
- nyoj--16 矩形嵌套(经典DP)
- 焦点轮播图
- href="javascript:_do(this);"和onclick="_do(this)"的区别
- Effective C++学习笔记 条款07:为多态基类声明virtual析构函数
- STL面试题
- 循环语句练习题3(猴子吃桃、放粮食和+-等于100)
- 【leetcode】【14】Longest Common Prefix
- MySQL知识(十五)——存储过程的调用、查看、修改和删除
- volatile关键字
- web service 接口操作