【模板】网络最大流

https://www.luogu.org/problem/show?pid=3376

题目描述

如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。

输入输出格式

输入格式:

 

第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。

接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)

 

输出格式:

 

一行,包含一个正整数,即为该网络的最大流。

 

输入输出样例

输入样例#1:
4 5 4 3
4 2 30
4 3 20
2 3 20
2 1 30
1 3 40
输出样例#1:
50

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=10,M<=25

对于70%的数据:N<=200,M<=1000

对于100%的数据:N<=10000,M<=100000

样例说明:

题目中存在3条路径:

4-->2-->3,该路线可通过20的流量

4-->3,可通过20的流量

4-->2-->1-->3,可通过10的流量(边4-->2之前已经耗费了20的流量)

故流量总计20+20+10=50。输出50。

 

#include<cstdio>
#include<queue>
#include<algorithm>
#define inf 1e9
using namespace std;
int n,m,tot=1;
int src,decc;
int front[10001],nextt[200001],to[200001],cnt[10001],lev[10001];
int cap[200001],ans;
queue<int>q; 
void add(int u,int v,int w) 
{ 
    to[++tot]=v;cap[tot]=w;nextt[tot]=front[u];front[u]=tot; 
    to[++tot]=u;cap[tot]=0;nextt[tot]=front[v];front[v]=tot; 
} 
bool bfs() 
{ 
    for(int i=0;i<=n;i++) {cnt[i]=front[i];lev[i]=-1;} 
    while(!q.empty()) q.pop(); 
    q.push(src);lev[src]=0; 
    while(!q.empty()) 
    { 
        int now=q.front();q.pop(); 
        for(int i=front[now];i!=0;i=nextt[i]) 
        { 
            int t=to[i]; 
            if(cap[i]>0&&lev[t]==-1) 
            { 
                q.push(t); 
                lev[t]=lev[now]+1; 
                if(t==decc) return true; 
            } 
        } 
    } 
    return false; 
} 
int dinic(int now,int flow) 
{ 
    if(now==decc) return flow; 
    int delta,rest=0; 
    for(int & i=cnt[now];i!=0;i=nextt[i]) 
    { 
        int t=to[i]; 
        if(lev[t]==lev[now]+1&&cap[i]>0) 
        { 
            delta=dinic(t,min(cap[i],flow-rest)); 
            if(delta) 
            { 
                cap[i]-=delta;cap[i^1]+=delta; 
                rest+=delta;if(rest==flow) break; 
            } 
        } 
    } 
    if(rest!=flow) lev[now]=-1; 
    return rest; 
} 
int main()
{
    scanf("%d%d%d%d",&n,&m,&src,&decc);
    int a,b,c;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
    }
    while(bfs()) 
    ans+=dinic(src,inf);
    printf("%d\n",ans);
}

 

posted @ 2017-03-04 21:26  TRTTG  阅读(360)  评论(3编辑  收藏  举报