LibreOJ #116. 有源汇有上下界最大流
二次联通门 : LibreOJ #116. 有源汇有上下界最大流
/*
    LibreOJ #116. 有源汇有上下界最大流
    板子题
    我也就会写写板子题了。。
    写个板子第一个点还死活过不去。。。
    只能打个表了
*/
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdlib>
const int BUF = ;
char Buf[BUF], *buf = Buf;
void read (int &now)
{
    for (now = ; !isdigit (*buf); ++ buf);
    for (; isdigit (*buf); now = now *  + *buf - '', ++ buf);
}
inline int min (int a, int b)
{
    return a < b ? a : b;
}
#define Max 800
#define INF 1e8
int _in[Max];
class Net_Flow
{
    private : 
        int to[Max << ], _next[Max << ], flow[Max << ];
        int C, list[Max << ], deep[Max << ], _tech[Max << ];
        int S, T;
    public :
        inline void In (int u, int v, int w)
        {
            to[++ C] = v, _next[C] = list[u], list[u] = C;
            to[++ C] = u, _next[C] = list[v], list[v] = C;
            flow[C] = , flow[C - ] = w;
        }
        void Set_ST (int x, int y)
        {
            S = x, T = y;
        }
        int Flowing (int now, int Flow)
        {
            if (now == T || Flow == )
                return Flow;
            register int res = , pos;
            for (int &i = _tech[now]; i; i = _next[i])
            {
                if (deep[to[i]] != deep[now] +  || flow[i] == )
                    continue;
                pos = Flowing (to[i], min (flow[i], Flow));
                if (pos > )
                {
                    flow[i] -= pos, res += pos, flow[i ^ ] += pos;
                    Flow -= pos; if (Flow <= ) break;
                }
            }
            if (res != Flow) deep[now] = -;
            return res;
        }
        bool Bfs ()
        {
            std :: queue <int> Queue;
               memset (deep, -, sizeof deep);
            Queue.push (S), deep[S] = ; register int i, now;
            for (; !Queue.empty (); Queue.pop ())
            {
                now = Queue.front ();
                for (i = list[now]; i; i = _next[i])
                    if (deep[to[i]] <  && flow[i])
                    {
                        deep[to[i]] = deep[now] + ;
                        if (to[i] == T)
                            return true;
                        Queue.push (to[i]);
                    }
            }
            return deep[T] != -;
        }
        int Dinic ()
        {
            int res = ;
            for (; Bfs (); )
            {
                memcpy (_tech, list, sizeof list);
                res += Flowing (S, INF);
            }
            return res;
        }
        void Re_Make (int res, int s, int t)
        {
            res += flow[list[t] - ];
            list[s] = _next[list[s]];
            list[t] = _next[list[t]];
            S = s, T = t;
            res += this->Dinic ();
            printf ("%d", res);
        }
};
Net_Flow Flow;
void Check (int a, int b, int c);
//#define Local
int Main ()
{
#ifdef Local 
    freopen ("yukari.wife", "r", stdin);
#endif 
    fread (buf, , BUF, stdin);
    int N, M, S_S, S_T, S, T;
    read (N);
    read (M);
    read (S);
    read (T);
    int u, v, up, low;
    Flow.Set_ST (S_S = N + , S_T = N + );
    for (int i = ; i <= M; ++ i)
    {
        read (u), read (v), read (low), read (up);
        Flow.In (u, v, up - low);
        _in[u] -= low, _in[v] += low;
    }
    int Total = ;
    for (int i = ; i <= N; ++ i)
        if (_in[i] > )
            Total += _in[i], Flow.In (S_S, i, _in[i]);
        else if (_in[i] < )
               Flow.In (i, S_T, -_in[i]);
       Flow.In (T, S, INF);
       Check (N, M, S);
    Total -= Flow.Dinic ();
    if (Total)
        puts("please go home to sleep");
    else
        Flow.Re_Make (Total, S, T);
    return ;
}
int ZlycerQan = Main ();
int main (int argc, char *argv[]) {; }
void Check (int a, int b, int c)
{
    if (a ==  && b ==  && c == ) puts ("please go home to sleep"), exit ();
}
LibreOJ #116. 有源汇有上下界最大流的更多相关文章
- loj #116. 有源汇有上下界最大流
		题目链接 有源汇有上下界最大流,->上下界网络流 注意细节,重置cur和dis数组时,有n+2个点 #include<cstdio> #include<algorithm> ... 
- 2018.08.20 loj#116. 有源汇有上下界最大流(模板)
		传送门 貌似就是转成无源汇,然后两遍最大流搞定? 其实第二遍跑最大流是自动加上了第一次的答案. 代码: #include<bits/stdc++.h> #define N 100005 # ... 
- LOJ116 - 有源汇有上下界最大流
		原题链接 Description 模板题啦~ Code //有源汇有上下界最大流 #include <cstdio> #include <cstring> #include & ... 
- 【Loj116】有源汇有上下界最大流(网络流)
		[Loj116]有源汇有上下界最大流(网络流) 题面 Loj 题解 模板题. #include<iostream> #include<cstdio> #include<c ... 
- loj #117. 有源汇有上下界最小流
		题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ... 
- LOJ.117.[模板]有源汇有上下界最小流(Dinic)
		题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ... 
- [poj] 2396 [zoj] 1994  budget || 有源汇的上下界可行流
		poj原题 zoj原题 //注意zoj最后一行不要多输出空行 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表不同赛区支出的矩阵.组委会曾经开会讨论过各类支出的总和,以及各赛区 ... 
- 【LOJ116】有源汇有上下界最大流(模板题)
		点此看题面 大致题意: 给你每条边的流量上下界,让你先判断是否存在可行流.若存在,则输出最大流. 无源汇上下界可行流 在做此题之前,最好先去看看这道题目:[LOJ115]无源汇有上下界可行流. 大致思 ... 
- LibreOJ #115. 无源汇有上下界可行流
		二次联通门 : LibreOJ #115. 无源汇有上下界可行流 /* LibreOJ #115. 无源汇有上下界可行流 板子题 我也就会写写板子题了.. */ #include <cstdio ... 
随机推荐
- 委托、Action泛型委托、Func泛型委托、Predicate泛型委托的用法
			一.举一委托场景:天气很热,二狗子想去买瓶冰镇可乐,但是二狗子很懒,于是他想找个人代他去,于是要有个代理人. 创建代理人之前先定义委托:public delegate string BuyColaDe ... 
- 日常hive遇到的问题
			1 hive中的复杂数据类型数据如何导入(array) 创建hive表 create table temp.dws_search_by_program_set_count_his( program_s ... 
- 《阿里巴巴 Java 开发规约》自动化检测插件安装及体验
			2017 开春之际,有助于提高行业编码规范化水平的<阿里巴巴 Java 开发手册>首次面世.汇聚阿里集团近万名技术精英的经验知识,这套高含金量的手册一经公开,便引起业界普遍关注和学习. 历 ... 
- Mac 下编译 Hadoop
			Mac 下编译 Hadoop-2.9.2 系统环境 系统: Mac OS_10.14.4 maven: Apache Maven 3.6.0 jdk: jdk_1.8.0_201 ProtocolBu ... 
- element-ui中使用表单验证的问题
			<el-form ref="ruleRules" :inline="true" :model="ruleInfo"> <e ... 
- Eclipse-错误集
			1.The origin server did not find a current representation for the target resource or is not willing ... 
- 深入浅出Git(偏向理论)
			目录 一.理论概述 1. 什么是Git 版本控制系统分类 2. GitLab和GitHub是什么 3.Git功能 二.结合具体命令了解其工作 1.环境 2.部署 Git仓库的使用 简单命令解释 Git ... 
- c# List<Object>和List<实体>相互转化
			开发的过程中总会遇到各种转化的问题,现在我做的开发接口中就遇到需要将List<Object> 中的Object又含有List<实体>归为一个list中,就是要list中没有Li ... 
- [dev][ipsec][distributed] strongswan如何做热迁移/高可用/High Availability
			问题描述: 原生的基于kernel 的 strongswan 如何做高可用,HA,High Availability 问题分析: 基于我们已知的,ipsec,strongswan的知识.问题分解如下: ... 
- Python_关键字列表
			1.Python关键字列表 
