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

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <stdlib.h>
    #include <math.h>
    #include <ctype.h>
    #include <queue>
    #include <map>
    #include <set>
    #include <algorithm>
    
    using namespace std;
    const int INF=0x3f3f3f3f;
    int head[500], source, sink, nv, cnt;
    int cur[500], num[500], d[500], pre[500];
    struct node
    {
        int u, v, cap, next;
    } edge[100000];
    void add(int u, int v, int cap)
    {
        edge[cnt].v=v;
        edge[cnt].cap=cap;
        edge[cnt].next=head[u];
        head[u]=cnt++;
    
        edge[cnt].v=u;
        edge[cnt].cap=0;
        edge[cnt].next=head[v];
        head[v]=cnt++;
    }
    void bfs()
    {
        memset(num,0,sizeof(num));
        memset(d,-1,sizeof(d));
        queue<int>q;
        q.push(sink);
        d[sink]=0;
        num[0]=1;
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            for(int i=head[u]; i!=-1; i=edge[i].next)
            {
                int v=edge[i].v;
                if(d[v]==-1)
                {
                    d[v]=d[u]+1;
                    num[d[v]]++;
                    q.push(v);
                }
            }
        }
    }
    void isap()
    {
        memcpy(cur,head,sizeof(cur));
        int flow=0, u=pre[source]=source, i;
        bfs();
        while(d[source]<nv)
        {
            if(u==sink)
            {
                int f=INF, pos;
                for(i=source; i!=sink; i=edge[cur[i]].v)
                {
                    if(f>edge[cur[i]].cap)
                    {
                        f=edge[cur[i]].cap;
                        pos=i;
                    }
                }
                for(i=source; i!=sink; i=edge[cur[i]].v)
                {
                    edge[cur[i]].cap-=f;
                    edge[cur[i]^1].cap+=f;
                }
                flow+=f;
                u=pos;
            }
            for(i=cur[u]; i!=-1; i=edge[i].next)
            {
                if(d[edge[i].v]+1==d[u]&&edge[i].cap)
                    break;
            }
            if(i!=-1)
            {
                cur[u]=i;
                pre[edge[i].v]=u;
                u=edge[i].v;
            }
            else
            {
                if(--num[d[u]]==0) break;
                int mind=nv;
                for(i=head[u]; i!=-1; i=edge[i].next)
                {
                    if(mind>d[edge[i].v]&&edge[i].cap)
                    {
                        mind=d[edge[i].v];
                        cur[u]=i;
                    }
                }
                d[u]=mind+1;
                num[d[u]]++;
                u=pre[u];
            }
        }
        printf("%d
    ",flow);
    }
    int main()
    {
        int n, m, i, u, v, w, num=0;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            memset(head,-1,sizeof(head));
            cnt=0;
            source=1;
            sink=m;
            nv=sink+1;
            while(n--)
            {
                scanf("%d%d%d",&u,&v,&w);
                add(u,v,w);
            }
            //printf("Case %d: ",num);
            isap();
        }
        return 0;
    }
  • 相关阅读:
    ReactNative 打包 APK
    ReactNative常用命令
    ReactNative之坑:停在gradle一直出点
    Python搭建Web服务器,与Ajax交互,接收处理Get和Post请求的简易结构
    tensorflow 安装升级
    sqlserver 全库查询 带架构
    气象数据资料整理
    poj2841
    cf1430e
    cf1436d
  • 原文地址:https://www.cnblogs.com/yangyongqian/p/3921580.html
Copyright © 2011-2022 走看看