网络流模板

这是一道网络流模板题。

你需要求出点1到点n的最大流。

本题时限2s,空间限制512M(大概相当于正常机子4s)

数据已更新

输入格式

输入第一行为两个正整数n和m。

以下m行每行三个正整数ai、bi、ci,表示ai到bi有一条容量为ci的单向边。

输出格式

一行输出最大流。

输入样例

2 1

1 2 3

输出样例

3

数据范围

1≤n≤3000,1≤m≤200000,1≤ai,bi≤n,0≤ci≤1000。

#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 3010
#define M 400010
#define inf 200000000
using namespace std;
int g[N],dep[N],n,m,cnt=1;
queue<int> q;
struct nee{
    int nxt,to,f;
}e[M];
inline void addedge(int x,int y,int w){
    e[++cnt]=(nee){g[x],y,w};g[x]=cnt;
}
inline void adde(int u,int v,int w){
    addedge(u,v,w);addedge(v,u,0);
}
inline bool BFS(int u){
    memset(dep,0,sizeof(dep));
    q.push(u);dep[u]=1;
    while(!q.empty()){
        u=q.front();q.pop();
        for(int i=g[u];i;i=e[i].nxt){
            if(e[i].f&&!dep[e[i].to]){
                q.push(e[i].to);
                dep[e[i].to]=dep[u]+1;
            }
        }
    }
    return dep[n];
}
inline int dfs(int u,int f){
    int ret=0;
    if(u==n) return f;
    for(int i=g[u],d;i&&f;i=e[i].nxt){
        if(e[i].f&&dep[e[i].to]>dep[u]){
            d=dfs(e[i].to,min(f,e[i].f));
            f-=d;ret+=d;e[i].f-=d;e[i^1].f+=d;
        }
    }
    if(!ret) dep[u]=-1;
    return ret;
}
inline int dicnic(){
    int ret=0;
    while(BFS(1)) ret+=dfs(1,inf);
    return ret;
}
inline void Jimmy(){
    scanf("%d%d",&n,&m);
    for(int i=1,u,v,w;i<=m;i++){
        scanf("%d%d%d",&u,&v,&w);
        adde(u,v,w);
    }
    printf("%d",dicnic());
}
int main(){
    Jimmy();
    return 0;
}
View Code

1≤n≤3000,1≤m≤200000,1≤ai,bi≤n,0≤ci≤1000。

原文地址:https://www.cnblogs.com/JimmyC/p/6624486.html