传送门

这题真有意思。。。

先是有一个点T的我怀疑人生。

然后学大佬们封装了我的dinic就莫名其妙的过了???

所以说锅给谁好呢?

给dinic吧。。。

解法就是先求出一段可行流,然后从t到s加一条容量为inf的边将能缩回去的都缩回去。

代码:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define N 100005
#define M 2000010
using namespace std;
#define rep(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
#define drep(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
ll ans;
int S,T;
struct Node{int v,next,c;};
struct Max_Flow{
    int n,cur[N],first[N],d[N],cnt;
    Node e[M];
    inline void add_edge(int u,int v,int c){e[++cnt].v=v,e[cnt].next=first[u],e[cnt].c=c,first[u]=cnt;}
    inline void add(int u,int v,int c){add_edge(u,v,c),add_edge(v,u,0);}
    inline bool bfs(){
        rep(i,1,n)d[i]=-1;
        queue<int>q;
        q.push(S),d[S]=0;
        while(!q.empty()){
            int x=q.front();
            q.pop();
            for(int i=first[x];i;i=e[i].next){
                int v=e[i].v;
                if(e[i].c&&d[v]==-1){
                    d[v]=d[x]+1;
                    if(v==T)return true;
                    q.push(v);
                }
            }
        }
        return false;
    }
    inline int dfs(int x,int f){
        if(x==T||!f)return f;
        int flow=f,tmp;
        for(int &i=cur[x];i;i=e[i].next){
            int v=e[i].v;
            if(e[i].c&&d[v]==d[x]+1){
                tmp=dfs(v,min(e[i].c,flow));
                if(!tmp)d[v]=-1;
                e[i].c-=tmp,e[i^1].c+=tmp,flow-=tmp;
                if(!flow)return f;
            }
        }
        return f-flow;
    }
    inline void solve(){while(bfs()){rep(i,1,n)cur[i]=first[i];ans+=dfs(S,inf);}}
}Dinic;
int sum[N];
int main(){
    Dinic.cnt=1;
    int n=read(),m=read(),ss=read(),tt=read();
    S=n+1,T=n+2,Dinic.n=T;
    rep(i,1,m){
        int u=read(),v=read(),down=read(),up=read();
        sum[u]-=down,sum[v]+=down,Dinic.add(u,v,up-down);
    }
    rep(i,1,n){
        if(sum[i]>0)Dinic.add(S,i,sum[i]);
        if(sum[i]<0)ans+=sum[i],Dinic.add(i,T,-sum[i]);
    }
    Dinic.solve(),Dinic.add(tt,ss,inf),Dinic.solve();
    if(ans){cout<<"please go home to sleep";return 0;}
    cout<<Dinic.e[Dinic.cnt].c;
    return 0;
}

2018.08.20 loj#117. 有源汇有上下界最小流(模板)的更多相关文章

  1. 2018.08.20 loj#116. 有源汇有上下界最大流(模板)

    传送门 貌似就是转成无源汇,然后两遍最大流搞定? 其实第二遍跑最大流是自动加上了第一次的答案. 代码: #include<bits/stdc++.h> #define N 100005 # ...

  2. loj #117. 有源汇有上下界最小流

    题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...

  3. 2018.08.20 loj#115. 无源汇有上下界可行流(模板)

    传送门 又get到一个新技能,好兴奋的说啊. 一道无源汇有上下界可行流的模板题. 其实这东西也不难,就是将下界变形而已. 准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源 ...

  4. LOJ.117.[模板]有源汇有上下界最小流(Dinic)

    题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...

  5. loj #116. 有源汇有上下界最大流

    题目链接 有源汇有上下界最大流,->上下界网络流 注意细节,重置cur和dis数组时,有n+2个点 #include<cstdio> #include<algorithm> ...

  6. sgu 176 Flow construction(有源汇的上下界最小流)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11025 [模型] 有源汇点的上下界最小流.即既满足上下界又满足 ...

  7. Flow construction SGU - 176 有源汇有上下界最小流 二分法和回流法

    /** 题目:Flow construction SGU - 176 链接:https://vjudge.net/problem/SGU-176 题意: 有源汇有上下界的最小流. 给定n个点,m个管道 ...

  8. Loj#116-[模板]有源汇有上下界最大流

    正题 题目链接:https://loj.ac/p/116 题目大意 \(n\)个点\(m\)条边的一张图,每条边有流量上下限制,求源点到汇点的最大流. 解题思路 先别急着求上面那个,考虑一下怎么求无源 ...

  9. Crazy Circuits HDU - 3157(有源汇有上下界最小流)

    给出每条边的下界 求最小流 板题 提供两个板子代码 虽然这个题 第一个比较快 但在loj上https://loj.ac/problem/117 的板题  第一个1700+ms 第二个才600+ms   ...

随机推荐

  1. iphone splash screen

    https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articl ...

  2. jsonp 原理

    1 json width padding(内填充); 2.计算机文件的属性 并不是以 文件的后缀名确定的,后缀名只是给人看的: 3.script 标签获取数据后 并不能直接使用: 4.尽可能 少声明 ...

  3. 将Ctrl+Alt+Delete键进行屏蔽,防止误操作重启服务器

    [root@bgw-t ~]# vi  /etc/init/control-alt-delete.conf #exec /sbin/shutdown -r now "Control-Alt- ...

  4. How To Pronounce 3-Syllable Phrases

    How To Pronounce 3-Syllable Phrases Share Tweet Share Tagged With: 3-Syllable Learn about the stress ...

  5. Haskell语言学习笔记(37)RWS, RWST

    RWST Monad转换器 RWST Monad转换器是将 ReaderT, WriterT 以及 StateT 这三个Monad转换器的功能集于一体的产物. newtype RWST r w s m ...

  6. 2017.1.9版给信息源新增:max_len、max_db字段

    2017.1.8a版程序给信息源增加max_len.max_db字段,分别用于控制:获取条数.数据库保留条数. max_len的说明见此图: max_db的说明见此图: 当max_len和max_db ...

  7. SQL Server:查看数据库用户权限(SQL 2005)

    1. 查看 SQL 2005 用户所属数据库角色 use yourdb go select DbRole = g.name, MemberName = u.name, MemberSID = u.si ...

  8. 在SQL Server中使用CLR调用.NET方法

    介绍    我们一起来做个示例,在.NET中新建一个类,并在这个类里新建一个方法,然后在SQL Server中调用这个方法.按照微软所述,通过宿主 Microsoft .NET Framework 2 ...

  9. git cherry-pick用法

    场景: 如果你的应用已经发布了一个版本2.0, 代码分支叫release-2.0, 现在正在开发3.0, 代码的分支叫dev-3.0. 那么有一天产品说, 要把正在开发的某个特性提前上线, 也就是说要 ...

  10. Appuim学习路-Appuim介绍

    (学一个东西,总的知道它支持什么.为什么要选择它吧?所以我就去看github上的介绍了.发现大家介绍的来源大多来自于此)   Appium是一个开源的自动化框架,是跨平台的,允许所有平台使用同一套AP ...