zoukankan      html  css  js  c++  java
  • 网络流——SAP模板

    //网络流SAP模板,复杂度O(N^2*M)
    //使用前调用init(源点,汇点,图中点的个数),然后调用add_edge()加边
    //调用getflow得出最大流
    #define N 55
    #define M 500500
    #define INF 0x3fffff
    
    
    struct Max_Flow
    {
        struct node
        {
            int to,w,next;
        }edge[M];
        
        int s,t;
        int nn;
        int cnt,pre[N];
        int lv[N],gap[N];
        
        void init(int ss,int tt,int num)
        {
            s=ss;
            t=tt;
            nn = num;//
            cnt=0;
            memset(pre,-1,sizeof(pre));
        }
        void add_edge(int u,int v,int w)//同时建两条边
        {
            edge[cnt].to=v;
            edge[cnt].w=w;
            edge[cnt].next=pre[u];
            pre[u]=cnt++;
            
            edge[cnt].to=u;
            edge[cnt].w=0;
            edge[cnt].next=pre[v];
            pre[v]=cnt++;
        }
        
        int sdfs(int k,int w)
        {
            if(k==t) return w;
            int f=0;
            int mi=nn-1;
            for(int p=pre[k];p!=-1;p=edge[p].next)
            {
                int v=edge[p].to,tw=edge[p].w;
                if(tw!=0)
                {
                    if(lv[k]==lv[v]+1)
                    {
                        int tmp=sdfs(v,min(tw,w-f));
                        f+=tmp;
                        edge[p].w-=tmp;
                        edge[p^1].w+=tmp;
                        if(f==w||lv[s]==nn) break;
                    }
                    if(lv[v]<mi) mi=lv[v];
                }
            }
            if(f==0)
            {
                gap[lv[k]]--;
                if( gap[ lv[k] ]==0 )
                {
                    lv[s]=nn;
                }
                lv[k]=mi+1;
                gap[lv[k]]++;
            }
            return f;
        }
    
        int getflow()
        {
            int sum=0;
            memset(lv,0,sizeof(lv));
            memset(gap,0,sizeof(gap));
            gap[0]=nn;
            while(lv[s]<nn)
            {
                sum+=sdfs(s,INF);
            }
            return sum;
        }
        
    };
  • 相关阅读:
    JVM垃圾收集器以及内存分配
    VisualVM工具的使用
    jstack的使用
    内存溢出的定位与分析
    JVM的内存模型
    JVM运行参数
    kafka-高效读写数据+zookeeper作用+事务
    重定向机制
    HTTP协议、时间戳
    TCP常见面试题 
  • 原文地址:https://www.cnblogs.com/chenhuan001/p/5297756.html
Copyright © 2011-2022 走看看