最大流 POJ 1273

模板题( ⊙ o ⊙ )啊!
m个池塘,n条水渠,给出水渠连接的池塘所能流过的水量,求从1号池塘能流到m号池塘的水的最大流量

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200+10,maxm=1000+10;
int n,m,S,T,cnt;
int hd[maxn],to[maxm],nxt[maxm],fl[maxm],pos[maxn];//数组一定不能开小( ⊙ o ⊙ )啊!否则会TLE( ⊙ o ⊙ )啊!
void add(int x,int y,int z){
    to[cnt]=y,fl[cnt]=z,nxt[cnt]=hd[x],hd[x]=cnt++;
    to[cnt]=x,fl[cnt]=0,nxt[cnt]=hd[y],hd[y]=cnt++;//fl[i]代表品第i条边上的剩余可曾流量
}
int find(int v,int f){//v起点,f可增流量
    if(v==T)
        return f;//如果当前起点已经是汇点,那么直接返回当前可增流量
    int res=0,t;
    for(int i=hd[v];i!=-1&&f>res;i=nxt[i])//dfs求起点的下一层点---其实也就相当于在bfs
        if(pos[v]+1==pos[to[i]]&&fl[i]){
            t=find(to[i],min(f-res,fl[i]));fl[i]-=t,res+=t,fl[i^1]+=t;}
    if(!res)//如果res==0那么就代表此路不通,设为-1代表无法访问
        pos[v]=-1;
    return res;
}
bool bfs(){
    memset(pos,-1,sizeof(pos));
    int head=0,tail=0,q[maxn];
    pos[q[0]=S]=0;
    while(head<=tail){
        int t=q[head++];
        for(int i=hd[t];i!=-1;i=nxt[i])
            if(pos[to[i]]==-1&&fl[i])
                pos[q[++tail]=to[i]]=pos[t]+1;
    }
    return pos[T]>0;
}
int dinic(){
    int res=0,t;
    while(bfs())
        while(t=find(S,inf))
            res+=t;
    return res;
}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        memset(hd,-1,sizeof(hd));
        //memset(pos,-1,sizeof(pos));
        for(int i=1,x,y,z;i<=n;i++)
            scanf("%d%d%d",&x,&y,&z),add(x,y,z);
        S=1,T=m,cnt=0;
        printf("%d\n",dinic());
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值