zoukankan      html  css  js  c++  java
  • 洛谷 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;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    设计模式学习每日一记(1.简单工厂模式)
    poj1068
    设计模式学习每日一记(2.外观模式)
    qooxdoo一句话备忘录[不断更新]
    设计模式学习每日一记(4.抽象工厂)
    C# 各种数据类型的最大值和最小值常数
    ASP.NET中实现二级或多级域名(修改UrlRewrite)
    网站中定时发送邮件
    重提URL Rewrite(1):IIS与ASP.NET
    Server Application Unavailable 的解决方法
  • 原文地址:https://www.cnblogs.com/ruojisun/p/6504415.html
Copyright © 2011-2022 走看看