• 网络流 学习笔记 ①


    刚刚A了网络最大流,其实仔细思考网络流的过程还是挺简单的,只是因为它的修正思路比较独特,会让人有点难懂,但是最大流本身还是好理解的。
    先上EK的代码:

    #include<bits/stdc++.h>
    #define inf 0x3f3f3f3f
    using namespace std;
    const int maxn=1e4+5,maxm=1e5+5;
    
    inline int read(){
    	char ch=getchar();
    	int r=0,s=1;
    	while(ch>57||ch<48)s=ch==45?0:s,ch=getchar();
    	while(ch>=48&&ch<=57)r=r*10+ch-48,ch=getchar();
    	return s?r:-r;
    }
    
    queue < int > q;
    struct edge{int fa,to,nxt,f,c,rs;}e[maxm<<1];
    int n,m,st,ed,cnt,ans;
    int head[maxn],a[maxn],pre[maxn];
    
    void add(int u,int v,int w){
    	e[++cnt]=(edge){u,v,head[u],0,w,cnt+1},head[u]=cnt;
    	e[++cnt]=(edge){v,u,head[v],0,0,cnt-1},head[v]=cnt;
    	return;
    }
    
    bool Get_maxf(){
    	int u,v;
    	memset(a,0,sizeof(a));
    	while(q.size())q.pop();
    	q.push(st),pre[st]=0,a[st]=inf;
    	while(q.size()){
    		u=q.front(),q.pop();
    		for(int i=head[u];i;i=e[i].nxt){
    			v=e[i].to;
    			if(!a[v]&&e[i].c>e[i].f){
    				a[v]=min(a[u],e[i].c-e[i].f);
    				pre[v]=i;
    				q.push(v);
    			}
    		}
    		if(a[ed])break;
    	}
    	if(!a[ed])return 0;
    	for(int i=ed;i!=st;i=e[pre[i]].fa){
    		e[pre[i]].f+=a[ed];
    		e[e[pre[i]].rs].f-=a[ed];
    	}
    	ans+=a[ed];
    	return 1;
    }
    		  
    int main(){
    	n=read(),m=read(),st=read(),ed=read();
    	for(int i=1,x,y,z;i<=m;++i)x=read(),y=read(),z=read(),add(x,y,z);
    	while(Get_maxf());
    	printf("%d
    ",ans);
    	return 0;
    }
    
    

    然后我去咕下Dinic

    $Update : $ Dinic咕完了,现在先扔这里,要是联赛没退役就更

    code :

    #include<bits/stdc++.h>
    #define MIN(A,B) (A>B?B:A)
    #define inf 0x7fffffff
    using namespace std;
    const int maxm=1e5+5,maxn=1e4+5;
    
    inline int read(){
    	char ch=getchar();
    	int r=0,s=1;
    	while(ch>57||ch<48)s=ch==45?0:s,ch=getchar();
    	while(ch>=48&&ch<=57)r=r*10+ch-48,ch=getchar();
    	return s?r:-r;
    }
    
    queue < int > q;
    struct edge{int to,nxt,c,rs;}e[maxm<<1];
    int n,m,S,T,cnt,ans;
    int head[maxn],dep[maxn];
    
    void add(int u,int v,int w){
    	e[++cnt]=(edge){v,head[u],w,cnt+1},head[u]=cnt;
    	e[++cnt]=(edge){u,head[v],0,cnt-1},head[v]=cnt;
    	return;
    }
    
    bool bfs(){
    	int x,y;
    	memset(dep,0,sizeof(dep));
    	dep[S]=1;
    	while(q.size())q.pop();
    	q.push(S);
    	while(q.size()){
    		x=q.front(),q.pop();
    		for(int i=head[x];i;i=e[i].nxt){
    			y=e[i].to;
    			if(e[i].c&&!dep[y]){
    				dep[y]=dep[x]+1;
    				q.push(y);
    			}
    		}
    	}
    	return dep[T]?1:0;
    }
    
    int dfs(int u,int t,int f){
    	if(u==t||f==0)return f;
    	int res=0;
    	for(int i=head[u];i;i=e[i].nxt){
    		int v=e[i].to;
    		if(e[i].c&&dep[v]==dep[u]+1){
    			int tmp=dfs(v,t,MIN(e[i].c,f));
    			res+=tmp,f-=tmp;
    			e[i].c-=tmp;
    			e[e[i].rs].c+=tmp;
    		}
    	}
    	return res;
    }
    
    int main(){
    	n=read(),m=read(),S=read(),T=read();
    	for(int i=1,x,y,z;i<=m;++i)x=read(),y=read(),z=read(),add(x,y,z);
    	while(bfs())ans+=dfs(S,T,inf);
    	printf("%d
    ",ans);
    	return 0;
    }
    
    

    咕咕咕

  • 相关阅读:
    注解
    使用反射机制调用属性和私有成员与代理模式的介绍
    动态代理模式
    SVN的安装与常用功能使用以及解决安装配置过程中的一些错误
    企业私服
    -Java-log4j
    List,Set,Map用法以及区别
    接口和抽象类有什么区别
    Dalvik opcodes
    外派公司或者外包公司,真的适合选择吗?
  • 原文地址:https://www.cnblogs.com/dclicker/p/9891356.html
Copyright © 2020-2023  润新知