zoukankan      html  css  js  c++  java
  • 模板——Dinic

    震惊,照着SYCstudio的教程打出来的Dinic竟被呆滞怒斥是EK,惊了,打开教程的方式可能跟呆滞不太一样。

    #include<bits/stdc++.h>
    using namespace std;
    const int P=1000000007;
    int n,m,s,t,jump[100005]={0},num=1,deep[100005];
    struct edge{
    	int to,val,jump;
    }a[200005];
    void add(int x,int y,int z){
    	num++;
    	a[num].jump=jump[x];
    	jump[x]=num;
    	a[num].to=y;
    	a[num].val=z;
    }
    bool bfs(){
    	queue<int> q;
    	while (!q.empty()) q.pop();
    	for (int i=1; i<=n; i++) deep[i]=0;
    	deep[s]=1;
    	q.push(s);
    	while (!q.empty()){
    		int pos=q.front();
    		q.pop();
    		for (int i=jump[pos]; i; i=a[i].jump){
    			if (!deep[a[i].to] && a[i].val>0){
    				deep[a[i].to]=deep[pos]+1;
    				q.push(a[i].to);
    			}
    		}
    	}
    	return deep[t]!=0;
    }
    int dfs(int pos,int len){
    	if (pos==t) return len;
    	int used=0,w=0;
    	for (int i=jump[pos]; i; i=a[i].jump){
    		if (deep[a[i].to]==deep[pos]+1 && a[i].val>0){
    			w=len-used;
    			int le=dfs(a[i].to,min(w,a[i].val));
    			a[i].val-=le;
    			a[i^1].val+=le;
    			used+=le;
    			if(used==len) return len;
    		}
    	}
            if (!s) deep[pos]=0;
    	return used;
    }
    int main(){
    	int ans=0;
    	scanf("%d%d%d%d",&n,&m,&s,&t);
    	for (int i=1,x,y,z; i<=m; i++){
    		scanf("%d%d%d",&x,&y,&z);
    		add(x,y,z);
    		add(y,x,0);
    	}
    	int d;
    	while (bfs()){
    		ans+=dfs(s,P);
    	}
    	printf("%d",ans);
    	return 0;
    }
    

      

  • 相关阅读:
    容器小结
    STL之Map和multimap容器
    STL之Set和multiset容器
    STL之优先级队列priority_queue
    STL之List容器
    STL之Queue容器
    STL之stack容器
    应用安全-提权/降权相关整理
    安卓监听工具整理
    Linux命令整理-Kali
  • 原文地址:https://www.cnblogs.com/cain-/p/8504072.html
Copyright © 2011-2022 走看看