洛谷 P3376 【模板】网络最大流

题目描述

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

输入输出格式

输入格式:

 

第一行包含四个正整数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 <cstring>
#include <vector>
#include <cstdio>
#include <queue>

using namespace std;

struct node
{
    int to,next,dis;
}edge[100001*2];
int tot=1,Answer,dis[100001],head[100001*20],n,m,s,t,i,j;
void add(int from,int to,int w)
{
    tot++;
    edge[tot].next=head[from];
    edge[tot].to=to;
    edge[tot].dis=w;
    head[from]=tot;
}
bool bfs()
{
    queue<int>q;
    memset(dis,-1,sizeof(dis));
    dis[s]=0;
    q.push(s);
    while(!q.empty() )
    {
        int Top=q.front() ;
        q.pop() ;
        for(i=head[Top];i;i=edge[i].next)
        {
            if(dis[edge[i].to]==-1&&edge[i].dis>0)
            {
                dis[edge[i].to]=dis[Top]+1;
                if(edge[i].to==t) return 1;
                else q.push(edge[i].to); 
            }
        }
    }
    return 0;
}
int work(int now,int f)
{
    if(now==t||f==0) return f;
    int rest=0;
    for(int i=head[now];i;i=edge[i].next)
    {
        int v=edge[i].to;
        if(edge[i].dis>0&&dis[v]==dis[now]+1)
        {
            int t=work(v,min(f,edge[i].dis));
            rest+=t;
            f-=t;
            edge[i].dis-=t;
            edge[i^1].dis+=t;
            if(f==0) return rest;
        }
    }
    return rest;
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&s,&t);
    int u,v,l;
    for(i=0;i<m;++i)
    {
        scanf("%d%d%d",&u,&v,&l);
        add(u,v,l);
        add(v,u,0);
    }
    while(bfs()) Answer+=work(s,1e8);
    printf("%d",Answer);
    return 0;
}

 

posted @ 2017-03-05 10:13  杀猪状元  阅读(165)  评论(0编辑  收藏  举报