网络流板子-最小费用最大流(spfa)
shadowice1984
2018-04-04 20:34:28
这里是shadowice1984自用的板子
纯粹为了自己写的爽而采取的代码风格,所以只是自己看的懂就好了
tips:和最大流一样注意cnt的问题,然后似乎spfa的费用流会好些一点,当然也会慢一点?
```C
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;const int N=4010;const int M=4*1e6+10;
int v[M];int x[M];int c[M];int val[M];int al[N];int ct=1;
int flow;int cost;int s;int t;int d[N];int f[N];int p[N];
queue <int> q;bool book[N];int ctt;
inline void add(int u,int V,int cot,int va)
{
v[++ct]=V;x[ct]=al[u];al[u]=ct;c[ct]=cot;val[ct]=va;
v[++ct]=u;x[ct]=al[V];al[V]=ct;c[ct]=0;val[ct]=-va;
}
inline bool spfa()
{
for(int i=1;i<=ctt;i++){d[i]=0x3f3f3f3f;}
for(d[s]=0,q.push(s);!q.empty();q.pop())
{
for(int nw=q.front(),i=al[nw];i;i=x[i])
{
if(d[v[i]]<=d[nw]+val[i]||c[i]==0){continue;}
d[v[i]]=d[nw]+val[i];f[v[i]]=nw;p[v[i]]=i;
if(book[v[i]]){book[v[i]]=true;q.push(v[i]);}
}
}if(d[t]==0x3f3f3f3f){return false;}int mic=0x3f3f3f3f;
for(int i=t;i!=s;i=f[i]){mic=min(mic,c[p[i]]);}
for(int i=t;i!=s;i=f[i]){c[p[i]]-=mic;c[p[i]^1]+=mic;}
flow+=mic;cost+=d[t]*mic;return true;
}
```