zoukankan      html  css  js  c++  java
  • 最大流模板

    const int MAXN = ;
    const int INF = 0x3f3f3f3f;
     
    struct Edge{
    	int flow,to,rev;
    	Edge(){}
    	Edge(int a,int b,int c):to(a),flow(b),rev(c){}
    };
     
    vector<Edge> E[MAXN];
     
    inline void Add(int from,int to,int flow){
    	E[from].push_back(Edge(to,1,E[to].size()));
    	E[to].push_back(Edge(from,0,E[from].size()-1));
    }
    
    int deep[MAXN];
     
    bool BFS(int from,int to){
    	memset(deep,-1,sizeof deep);
    	deep[from] = 0;
    	queue<int> Q;
    	Q.push(from);
    	while(!Q.empty()){
    		int t = Q.front();
    		Q.pop();
    		for(int i=0 ; i<E[t].size() ; ++i){
    			Edge& e = E[t][i];
    			if(e.flow > 0 && deep[e.to] == -1){
    				deep[e.to] = deep[t] + 1;
    				Q.push(e.to);
    			}
    		}
    	}
    	return deep[to] != -1;
    }
     
    int iter[MAXN];
     
    int DFS(int from,int to,int flow){
    	if(from == to || flow == 0)return flow;
    	for(int &i=iter[from] ; i<E[from].size() ; ++i){
    		Edge &e = E[from][i];
    		if(e.flow > 0 && deep[e.to] == deep[from]+1){
    			int nowflow = DFS(e.to,to,min(flow,e.flow));
    			if(nowflow > 0){
    				e.flow -= nowflow;
    				E[e.to][e.rev].flow += nowflow;
    				return nowflow;
    			}
    		}
    	}
    	return 0;
    }
     
    int Dinic(int from,int to){
    	int sumflow = 0;
    	while(BFS(from,to)){
    		memset(iter,0,sizeof iter);
    		int t;
    		while((t=DFS(from,to,INF)) > 0)sumflow += t;
    	}
    	return sumflow;
    }
  • 相关阅读:
    [CERC2015]Digit Division
    [SDOI2012]拯救小云公主
    [不知道出自什么OJ]最大利润
    [USACO08FEB]修路Making the Grade
    P1985 [USACO07OPEN]翻转棋
    P1156 垃圾陷阱
    奶酪
    扫描线
    php数组
    php switch
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514056.html
Copyright © 2011-2022 走看看