您的位置:首页 > 其它

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: