zoukankan      html  css  js  c++  java
  • BZOJ3789 : 扫雪车

    有上下界的网络流

    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为源汇的最大流即为答案

    #include<cstdio>
    const int N=110,inf=~0U>>2;
    int n,m,i,j,w,t,S,T,SS,TT,h[N],gap[N],maxflow,sum,in[N],id[N];
    struct edge{int t,f;edge *nxt,*pair;}*g[N],*d[N];
    inline int min(int a,int b){return a<b?a:b;}
    inline void swap(int&a,int&b){int c=a;a=b;b=c;}
    inline void add(int s,int t,int f){
      edge *p=new(edge);p->t=t;p->f=f;p->nxt=g[s];g[s]=p;
      p=new(edge);p->t=s;p->f=0;p->nxt=g[t];
      g[t]=p;g[s]->pair=g[t];g[t]->pair=g[s];
    }
    int sap(int v,int flow,int S,int T){
      if(v==T)return flow;
      int rec=0;
      for(edge *p=d[v];p;p=p->nxt)if(h[v]==h[p->t]+1&&p->f){
        int ret=sap(p->t,min(flow-rec,p->f),S,T);
        p->f-=ret;p->pair->f+=ret;d[v]=p;
        if((rec+=ret)==flow)return flow;
      }
      d[v]=g[v];
      if(!(--gap[h[v]]))h[S]=TT;
      gap[++h[v]]++;
      return rec;
    }
    int main(){
      scanf("%d%d%d%d",&n,&m,&S,&T);
      for(i=1;i<=n;i++)id[i]=i;
      swap(id[S],id[n-1]),swap(id[T],id[n]);
      S=n-1,T=S+1,SS=T+1,TT=SS+1;add(T,S,inf);
      while(m--){
        scanf("%d%d%d%d",&i,&j,&w,&t);
        i=id[i],j=id[j];
        if(t)in[i]-=w,in[j]+=w;else add(i,j,w);
      }
      for(i=1;i<=TT;i++)if(in[i]>0)sum+=in[i],add(SS,i,in[i]);else add(i,TT,-in[i]);
      for(gap[i=0]=TT;i++<TT;)d[i]=g[i];
      while(h[SS]<TT)maxflow+=sap(SS,inf,SS,TT);
      if(sum!=maxflow)return puts("0"),0;
      for(maxflow=i=0;i<=TT;i++)d[i]=g[i],h[i]=gap[i]=0;
      gap[0]=TT;
      while(h[S]<TT)maxflow+=sap(S,inf,S,T);
      return printf("%d",maxflow),0;
    }
    

      

  • 相关阅读:
    UITableViewCell隔行换颜色
    NSUserDefaults数据保存使用
    使用API获取(默认付款条件和到期日)
    分类账和法人实体
    如何避免Oracle Form界面倒入.csv文件出现乱码
    XML publisher 填充空白行数
    DBA处理异常常用SQL
    wsh_deliveries_pub.create_update_delivery异常
    sql
    破解Oracle ERP密码
  • 原文地址:https://www.cnblogs.com/clrs97/p/4403186.html
Copyright © 2011-2022 走看看