zoukankan      html  css  js  c++  java
  • 最大流 isap 模板

    存一个最大流isap的模板
    直接填入m,n,S,T 就可以跑了

    #include<cstdio>
    #include<cstring>
    #include<climits>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int n,m,flow;
    #define MAXN 1100
    #define MAXM 550000
    bool vis[MAXN];
    int g[MAXN][MAXN],d[MAXN];
    bool r[MAXN][MAXN];
    int cd[MAXN];
    int S,T;
    inline int min(int a,int b)
    {return a<b?a:b;}
    void init(){
        queue<int> que;
        que.push(T);
        vis[T]=true;
        while(!que.empty()){
            int u=que.front();
            que.pop();
            vis[u]=false;
            for(int i=1;i<=n;i++)//权值为1 = =
                if(r[u][i]&&d[i]>d[u]+1/*+r[u][i]*/){
                    d[i]=d[u]+1;
                    //printf("d[%d]:%d
    ",i,d[i]);
                    if(!vis[i]){
                        vis[i]=true;
                        que.push(i);
                    }
                }
        }
        for(int i=1;i<=n;i++)
            if(d[i]<=n)cd[d[i]]++;
    }
    int aug(int u,int f){
        if(u==T)return f;
        //printf("at:%d %d
    ",u,f);
        int uf=f;
        for(int i=1;i<=n;i++)
            if(g[u][i]&&d[i]==d[u]-1){
                int k=aug(i,min(g[u][i],uf));
                g[u][i]-=k;
                g[i][u]+=k;
                uf-=k;
                if(!uf)break;
            }
        if(uf==f){
            cd[d[u]]--;
            if(!cd[d[u]]){d[S]=n+1;return 0;}//GAP
            d[u]=n+1;//不能用INT_MAX 溢出就好玩了
            for(int i=1;i<=n;i++)
                if(g[u][i])d[u]=min(d[u],d[i]+1);
            cd[d[u]]++;
        }
        return f-uf;
    }
    void sap(){
        for(int i=0;i<=n;i++)d[i]=0x3f3f3f3f;
        d[T]=0;
        init();
        while(d[S]<n)flow+=aug(S,INT_MAX);
    }
    inline void addedge(int a,int b,int c){
        g[a][b]+=c;
        r[b][a]=true;
    }
    int main(){
        scanf("%d%d",&m,&n);
        for(int i=1;i<=m;i++){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            addedge(a,b,c);
        }
        S=1;
        T=n;
        sap();
        printf("%d
    ",flow);
    }
    
  • 相关阅读:
    读书笔记五
    读书笔记四
    读书笔记3(Teamwork)
    读书笔记二(合格的软件工程师)
    读书笔记1(软件 = 程序 + 工程)
    关于使用Java开发Mis系统
    课堂动手动脑
    Quartz学习
    把数据库中取出的DataTable转换成一个对象 或者对象列表
    SAE上使用cron定时发微博
  • 原文地址:https://www.cnblogs.com/Hineven/p/5843568.html
Copyright © 2011-2022 走看看