zoukankan      html  css  js  c++  java
  • Dinic 与 SAP(ISAP?) 模板

    发一个最大流模板

    DinicDinic

    //vis为int类型
    //sz为总点数
    namespace Dinic {
    	inline bool bfs() {
    	    int head = 0, tail = 0;
    	    vis[S] = ++cur; q[tail++] = S; dis[S] = 0;
    	    while(head < tail) {
    	        int u = q[head++];
    	        for(int i = fir[u]; ~i; i = e[i].nxt)
    	            if(e[i].c && vis[e[i].to] != cur)
    	                vis[e[i].to] = cur, dis[e[i].to] = dis[u] + 1, q[tail++] = e[i].to;
    	    }
    	    if(vis[T] == cur) memcpy(info, fir, (sz+1)<<2);
    	    return vis[T] == cur;
    	}
    	int dfs(int u, int Max) {
    	    if(u == T || !Max) return Max;
    	    int flow=0, delta;
    	    for(int &i = info[u]; ~i; i = e[i].nxt)
    	        if(e[i].c && dis[e[i].to] == dis[u] + 1 && (delta=dfs(e[i].to, min(e[i].c, Max-flow)))) {
    	            e[i].c -= delta, e[i^1].c += delta, flow += delta;
    	            if(flow == Max) return flow;
    	        }
    		if(!flow) dis[u] = -1;
    	    return flow;
    	}
    	inline int dinic() {
    	    int flow=0, x;
    	    while(bfs()) while((x=dfs(S, inf))) flow+=x;
    	    return flow;
    	}
    }
    

    SAP(ISAP?) 1.0SAP(ISAP?) 1.0

    //sz为总点数
    namespace SAP {
    	int d[MAXN], vd[MAXN];
    	int Aug(int u, int Max) {
    		if(u == T) return Max;
    		int delta, dmin = sz - 1, flow = 0, v;
    		for(int i = fir[u]; ~i; i = e[i].nxt) if(e[i].c) {
    			v = e[i].to;
    			if(d[v] + 1 == d[u]) {
    				delta = Aug(v, min(Max-flow, e[i].c));
    				e[i].c -= delta, e[i^1].c += delta, flow += delta;
    				if(d[S] >= sz || flow == Max) return flow;
    			}
    			if(dmin > d[v]) dmin = d[v];
    		}
    		if(!flow) {
    			if(!(--vd[d[u]])) d[S] = sz;
    			++vd[d[u] = dmin + 1];
    		}
    		return flow;
    	}
    	int sap() {
    		int ans = 0;
    		while(d[S] < sz)
    			ans += Aug(S, inf);
    		return ans;
    	}
    }
    

    SAP(ISAP?) 2.0SAP(ISAP?) 2.0

    //sz为总点数
    namespace SAP {
    	int h[MAXN], gap[MAXN];
    	int Aug(int u, int Max) {
    		if(u == T) return Max;
    		int delta, flow = 0, v;
    		for(int i = info[u]; ~i; i = e[i].nxt)
    			if(e[i].c && h[v=e[i].to] + 1 == h[u]) {
    				delta = Aug(v, min(Max-flow, e[i].c));
    				e[i].c -= delta, e[i^1].c += delta; info[u] = i;
    				if((flow+=delta) == Max || h[S] == sz) return flow;
    			}
    		if(!(--gap[h[u]])) h[S] = sz;
    		++gap[++h[u]]; info[u] = fir[u];
    		return flow;
    	}
    	int sap() {
    		memset(h, 0, sizeof h);
    		memset(gap, 0, sizeof gap);
    		memcpy(info, fir, sizeof fir);
    		int flow = 0;
    		while(h[S] < sz)
    			flow += Aug(S, inf);
    		return flow;
    	}
    }
    
  • 相关阅读:
    Exception: Failed to execute 'setItem' on 'Storage'
    element ui中动态添加的表单进行验证
    10. 自定义assertThat中的Matcher函数lt、gt
    8. anyInt()、anyString()、eq()、anyCollection()、verify验证void方法
    7. 参数匹配:eq、isA、any
    6. spy
    4-5. when-thenXX、doXX-when、Answer、thenCallRealMethod
    2. 开启Mock的三种方式、深度Mook
    1. quickstart
    Sentinel
  • 原文地址:https://www.cnblogs.com/Orz-IE/p/12039404.html
Copyright © 2011-2022 走看看