网络流板子-最小费用最大流(spfa)

shadowice1984

2018-04-04 20:34:28

Personal

这里是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; } ```