网络流的板子-最大流(dinic)

shadowice1984

2018-04-04 20:18:06

Personal

这里是shadowice1984自用的板子…… 由于是给自己写的板子所以不会有太详细的解释…… tips:cnt=1,用板子的时候染色编号非常重要 ```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 al[N];int ct=1;queue <int> q;int d[N]; int s;int t;int ctt; inline void add(int u,int V,int cot) { v[++ct]=V;x[ct]=al[u];c[ct]=cot;al[u]=ct; v[++ct]=u,x[ct]=al[V];c[ct]=0;al[V]=ct; } inline bool bfs() { 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]]!=0x3f3f3f3f||c[i]==0){continue;} d[v[i]]=d[nw+1];q.push(v[i]); } }return d[t]!=0x3f3f3f3f; } inline int dfs(int u,int lim) { if(u==t){return lim;}int f=0; for(int i=al[u];i&&lim;i=x[i]) { if(d[v[i]]!=d[u]+1||c[i]==0){continue;} int de=dfs(v[i],min(lim,c[i])); c[i]-=de;c[i^1]+=de;lim-=de;f+=de; }d[u]=f?d[u]:0x3f3f3f3f;return f; } ```