网络流板子

Posted uid001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络流板子相关的知识,希望对你有一定的参考价值。

最大流dinic板子

const int N = 1e6+10, S = N-2, T = N-1, INF = 0x3f3f3f3f;
int n;
struct edge 
    int to,w,next;
    edge(int to=0,int w=0,int next=0):to(to),w(w),next(next)
 e[N];
int head[N], dep[N], vis[N], cur[N], cnt=1;
queue<int> Q;
void add(int u, int v, int w) 
    e[++cnt] = edge(v,w,head[u]);
    head[u] = cnt;
    e[++cnt] = edge(u,0,head[v]);
    head[v] = cnt;

int bfs() 
    REP(i,1,n) dep[i]=INF,vis[i]=0,cur[i]=head[i];
    dep[S]=INF,vis[S]=0,cur[S]=head[S];
    dep[T]=INF,vis[T]=0,cur[T]=head[T];
    dep[S]=0,Q.push(S);
    while (Q.size()) 
        int u = Q.front(); Q.pop();
        for (int i=head[u]; i; i=e[i].next) 
            if (dep[e[i].to]>dep[u]+1&&e[i].w) 
                dep[e[i].to]=dep[u]+1;
                Q.push(e[i].to);
            
        
    
    return dep[T]!=INF;

int dfs(int x, int w) 
    if (x==T) return w;
    int used = 0;
    for (int i=cur[x]; i; i=e[i].next) 
        cur[x] = i;
        if (dep[e[i].to]==dep[x]+1&&e[i].w) 
            int f = dfs(e[i].to,min(w-used,e[i].w));
            if (f) used+=f,e[i].w-=f,e[i^1].w+=f;
            if (used==w) break;
        
    
    return used;

int dinic() 
    int ans = 0;
    while (bfs()) ans+=dfs(S,INF);
    return ans;

费用流EK+spfa板子

const int N = 1e6+10, INF = 0x3f3f3f3f, S = N-2, T = N-1;
int n, m, flow, cost;
struct edge 
    int to,w,v,next;
    edge(int to=0,int w=0,int v=0,int next=0):to(to),w(w),v(v),next(next)
 e[N];
int head[N], dep[N], vis[N], cur[N], f[N], cnt=1;
int pre[N],pre2[N];
queue<int> Q;
void add(int u, int v, int w, int k) 
    e[++cnt] = edge(v,w,k,head[u]);
    head[u] = cnt;
    e[++cnt] = edge(u,0,-k,head[v]);
    head[v] = cnt;

int spfa() 
    REP(i,1,n) f[i]=dep[i]=INF,vis[i]=0;
    f[S]=dep[S]=f[T]=dep[T]=INF;
    dep[S]=0,Q.push(S);
    while (Q.size()) 
        int u = Q.front(); Q.pop();
        vis[u] = 0;
        for (int i=head[u]; i; i=e[i].next) 
            if (dep[e[i].to]>dep[u]+e[i].v&&e[i].w) 
                dep[e[i].to]=dep[u]+e[i].v;
				pre[e[i].to]=u,pre2[e[i].to]=i;
                f[e[i].to]=min(f[u],e[i].w);
                if (!vis[e[i].to]) 
                    vis[e[i].to]=1;
                    Q.push(e[i].to);
                
            
        
    
    return dep[T]!=INF;

void EK()
    while(spfa()) 
        int w = f[T];
        for (int u=T; u!=S; u=pre[u]) 
            e[pre2[u]].w-=w;
            e[pre2[u]^1].w+=w;
        
        flow += w, cost += w*dep[T];
    

 

以上是关于网络流板子的主要内容,如果未能解决你的问题,请参考以下文章

板子网络流

网络流板子

板子 网络流算法

网络流板子

Plug It In!(网络流板子)

知识点网络流板子