最大流 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\n",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\n",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\n",flow);
}

转载于:https://www.cnblogs.com/Hineven/p/5843568.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值