HDOJ 1532 Drainage Ditches 网络流

次元传送门

老朽的第一道网路流问题

题意:
多Case,每次给定n和m,之后是n条边。求从1到n的最大流。

分析:
完全裸题……

代码实现

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<bitset>
#include<algorithm>
using namespace std;
const int N=1100,INF=0x3f3f3f3f;
struct Edge{
    int to,c,r;
};
vector<Edge> G[N];
bitset<N> used;
inline void addedge(int x,int y,int w){
    G[x].push_back((Edge){y,w,G[y].size()});
    G[y].push_back((Edge){x,0,G[x].size()-1});
}
inline int dfs(int s,int t,int now_flow){
    if(s==t)    return now_flow;
    used.set(s);
    for(int i=0;i<G[s].size();i++){
        Edge &tmp=G[s][i];
        if(!used[tmp.to]&&tmp.c>0){
            int new_flow=dfs(tmp.to,t,min(now_flow,tmp.c));
            if(new_flow>0){
                tmp.c-=new_flow;
                G[tmp.to][tmp.r].c+=new_flow;
                return new_flow;
            } 
        }
    }
    return 0;
}
inline int max_flow(int s,int t){
    int ans=0;
    while(true){
        used.reset();
        int new_flow=dfs(s,t,INF);
        if(new_flow==0) return ans;
        else ans+=new_flow;
    }
}
int main(){//HDOJ 1532
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=0;i<N;i++)
            G[i].clear();
        for(int i=0,x,y,w;i<n;i++){
            cin>>x>>y>>w;
            addedge(x,y,w);
        }
        cout<<max_flow(1,m)<<endl;
    }
    return 0;
}//By YOUSIKI 

嗯嗯,代码风格是向一位CSDN前辈学习的,用结构体的vector来存边感觉好机智啊,就是略诡异,轻吐槽。

By YOUSIKI

你可能感兴趣的:(HDOJ 1532 Drainage Ditches 网络流)