有上下界的网络流

T向S连容量为正无穷的边,将有源汇转化为无源汇

每条边容量减去下界,设in[i]表示流入i的下界之和减去流出i的下界之和

新建超级源汇SS,TT

对于in[i]>0的点,SS向i连容量为in[i]的边

对于in[i]<0的点,i向TT连容量为-in[i]的边

求出以SS,TT为源汇的最大流,如果等于$\sum in[i](in[i]>0)$,则有解

再求出以S,T为源汇的最大流即为答案

  1. #include<cstdio>
  2. const int N=110,inf=~0U>>2;
  3. int n,m,i,j,w,t,S,T,SS,TT,h[N],gap[N],maxflow,sum,in[N],id[N];
  4. struct edge{int t,f;edge *nxt,*pair;}*g[N],*d[N];
  5. inline int min(int a,int b){return a<b?a:b;}
  6. inline void swap(int&a,int&b){int c=a;a=b;b=c;}
  7. inline void add(int s,int t,int f){
  8. edge *p=new(edge);p->t=t;p->f=f;p->nxt=g[s];g[s]=p;
  9. p=new(edge);p->t=s;p->f=0;p->nxt=g[t];
  10. g[t]=p;g[s]->pair=g[t];g[t]->pair=g[s];
  11. }
  12. int sap(int v,int flow,int S,int T){
  13. if(v==T)return flow;
  14. int rec=0;
  15. for(edge *p=d[v];p;p=p->nxt)if(h[v]==h[p->t]+1&&p->f){
  16. int ret=sap(p->t,min(flow-rec,p->f),S,T);
  17. p->f-=ret;p->pair->f+=ret;d[v]=p;
  18. if((rec+=ret)==flow)return flow;
  19. }
  20. d[v]=g[v];
  21. if(!(--gap[h[v]]))h[S]=TT;
  22. gap[++h[v]]++;
  23. return rec;
  24. }
  25. int main(){
  26. scanf("%d%d%d%d",&n,&m,&S,&T);
  27. for(i=1;i<=n;i++)id[i]=i;
  28. swap(id[S],id[n-1]),swap(id[T],id[n]);
  29. S=n-1,T=S+1,SS=T+1,TT=SS+1;add(T,S,inf);
  30. while(m--){
  31. scanf("%d%d%d%d",&i,&j,&w,&t);
  32. i=id[i],j=id[j];
  33. if(t)in[i]-=w,in[j]+=w;else add(i,j,w);
  34. }
  35. for(i=1;i<=TT;i++)if(in[i]>0)sum+=in[i],add(SS,i,in[i]);else add(i,TT,-in[i]);
  36. for(gap[i=0]=TT;i++<TT;)d[i]=g[i];
  37. while(h[SS]<TT)maxflow+=sap(SS,inf,SS,TT);
  38. if(sum!=maxflow)return puts("0"),0;
  39. for(maxflow=i=0;i<=TT;i++)d[i]=g[i],h[i]=gap[i]=0;
  40. gap[0]=TT;
  41. while(h[S]<TT)maxflow+=sap(S,inf,S,T);
  42. return printf("%d",maxflow),0;
  43. }

  

BZOJ3789 : 扫雪车的更多相关文章

  1. angularjs笔记《二》

    小颖最近不知怎么了,老是犯困,也许是清明节出去玩,到现在还没缓过来吧,玩回来真的怕坐车了,报了个两日游得团,光坐车了,把人坐的难受得,去了也就是爬山,回来感觉都快瘫了,小颖去的时候还把我家仔仔抱着一起 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 入门OJ:扫雪

    扫雪1 题目描述 大雪履盖了整个城市,市政府要求冬季服务部门尽快将一些街道(列在一份清单中)的积雪清除掉以恢复交通,整个城市由许多交叉路口和街道构成,当然任意两个交叉路口都是直接或间接连通的,清单给出 ...

随机推荐

  1. B,B+,B-,B*树

    B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ...

  2. aspx注入靶机源码

    ASPX:   <%@ Page language="c#" validateRequest=false %> <!DOCTYPE HTML PUBLIC &qu ...

  3. Linux 磁盘的组成

    基本结构 磁道,扇区,柱面和磁头数 硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等.每个盘片有两面,都可记录信息. 每个磁道被分成许多扇形的区域,每个区域叫一个 ...

  4. 使用msgfmt编译多语言文件

    msgfmt --statistics --verbose -o django.mo django.po

  5. eclipse对Java程序的移植

    有些Java项目可能不在同一台计算机上开发,所以程序需要平台间进行移植,方法很简单,首先有一个最简单的项目HelloJava 当我们开发完成或者要休息了,一般都会保存然后在项目上右击,选择Close ...

  6. XP 之后, Delphi 动注册表不方便了...逼出来一个办法:

    XP 之后, Delphi 动注册表不方便了...逼出来一个办法: 手头的程序需要修改注册表, 以让当前程序成为某格式的默认打开程序并关联图标; Vista 之后需要管理员权限才能操作注册表, 很麻烦 ...

  7. Java for LeetCode 052 N-Queens II

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  8. angularjs 指令(directive)详解(2)

    原文地址 上一篇我们说到了transclude,那么,我们现在继续讲解之后的内容. 9.scope 可选参数,默认值为false.取值: false - 在这个directive里不会创建新的scop ...

  9. July 31st, Week 32nd Sunday, 2016

    If you wept for the missing sunset, you would miss all the shining stars. 如果你为错过夕阳而哭泣,那你有可能也会错过灿烂的星空 ...

  10. Linux多台服务器之间的文件共享

    由于项目有个图片上传和导入导出的模块,所以当项目通过集群方式部署的时候就要考虑文件共享问题. 文件共享要么就是通过统一的文件系统来管理,要么就是在系统之间做文件共享,前者扩展性比较好,可以随时随地加服 ...