zoukankan      html  css  js  c++  java
  • 网络流之当前弧优化浅谈

    在dinic中,我们会发现,dfs中每条边都会遍历至少一遍,那么我们可以把一定不会用到的边删去吗?

    答案是当然可以,这就用到了当前弧优化;

    其实这个优化在很久很久以前学习欧拉回路的时候就接触到了;

    每次增广一条路后可以看做“榨干”了这条路,既然榨干了就没有再增广的可能了。但如果每次都扫描这些“枯萎的”边是很浪费时间的。那我们就记录一下“榨取”到那条边了,然后下一次直接从这条边开始增广,就可以节省大量的时间。这就是 当前弧优化

    实现方法就是每次dfs时将head数组复制一遍,然后再新数组中跑dfs

    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    struct littlestar{
    	int to;
    	int nxt;
    	int w;
    }star[10010];
    int head[10010],cur[10010],cnt=1;
    void add(int u,int v,int w)
    {
    	star[++cnt].to=v;
    	star[cnt].nxt=head[u];
    	star[cnt].w=w;
    	head[u]=cnt;
    }
    int s,t;
    queue<int> q;
    int n;
    int dep[10010];
    bool bfs()
    {
    	for(int i=1;i<=n;i++){
    		dep[i]=0;
    		cur[i]=head[i];
    	}
    	while(q.size()) q.pop();
    	q.push(s);
    	dep[s]=1;
    	while(q.size()){
    		int u=q.front();
    		q.pop();
    		for(int i=head[u];i;i=star[i].nxt){
    			int v=star[i].to;
    			if(!dep[v]&&star[i].w){
    				dep[v]=dep[u]+1;
    				q.push(v);
    				if(v==t) return 1;
    			}
    		}
    	}
    	return 0;
    }
    int m;
    int dinic(int u,int flow)
    {
    	if(u==t) return flow;
    	int rest=flow,tmp;
    	for(int i=cur[u];i&&rest;i=star[i].nxt){
    		cur[u]=i;
    		int v=star[i].to;
    		if(dep[v]==dep[u]+1&&star[i].w){
    			tmp=dinic(v,min(star[i].w,rest));
    			if(!tmp) dep[v]=0;
    			star[i].w-=tmp;
    			star[i^1].w+=tmp;
    			rest-=tmp;
    		}
    	}
    	return flow-rest;
    }
    signed main()
    {
    	cin>>n>>m>>s>>t;
    	for(register int i=1;i<=m;i++){
    		int u,v,w;
    		scanf("%d%d%d",&u,&v,&w);
    		add(u,v,w);
    		add(v,u,0);
    	}
    	int maxflow=0;
    	while(bfs()){
    		int flow;
    		while(flow=dinic(s,LLONG_MAX)) maxflow+=flow;
    	}
    	cout<<maxflow;
    }
    
  • 相关阅读:
    jQuery 选择城市,显示对应的即时时区时间
    HTML5 LocalStorage 本地存储,刷新值还在
    jQuery 鼠标拖拽移动窗口
    css/css3常用收集/笔记
    Linux下删除命令 硬盘空间查看... 常用命令
    linux 下 zip unzip压缩与解压
    js字节转换、字节转换GB等
    jquery 判断网络图片,或网络文件是否存在
    js中substr,substring,indexOf,lastIndexOf,split 的用法
    apktool、dex2jar、jd-gui的区别及详解
  • 原文地址:https://www.cnblogs.com/kamimxr/p/11607636.html
Copyright © 2011-2022 走看看