zoukankan      html  css  js  c++  java
  • bzoj1061 志愿者招募

    传送门

    分析

    https://www.luogu.org/problemnew/solution/P3980

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    #include<climits>
    using namespace std;
    const int inf = INT_MAX;
    int n,m,f[40010],mf[40010],pre[40010],from[40010];
    int head[40010],nxt[40010],to[40010];
    int cost[40010],ath[40010],fr[40010],cnt;
    int d[40010];
    bool iq[40010];
    int s,t,Ans;
    int q[400100],fi,la;
    inline void add(int x,int y,int z,int c){
        nxt[++cnt]=head[x];
        head[x]=cnt;
        to[cnt]=y;
        f[cnt]=z;
        cost[cnt]=c;
        fr[cnt]=x;
        nxt[++cnt]=head[y];
        head[y]=cnt;
        to[cnt]=x;
        f[cnt]=0;
        cost[cnt]=-c;
        fr[cnt]=y;
        ath[cnt]=cnt-1;ath[cnt-1]=cnt;
    }
    inline void go(){
        register int i;
        while(1){
          for(i=s;i<=t;i+=4)d[i]=d[i+1]=d[i+2]=d[i+3]=inf;
          fi=la=100001;
          q[fi]=s;
          d[s]=0;
          iq[s]=1;
          int flow=inf;
          while(fi<=la){
              int x=q[fi];
            fi++;
            iq[x]=0;
            if(d[x]>=inf)continue;
            for(i=head[x];i;i=nxt[i]){
              if(f[i]&&d[to[i]]>d[x]+cost[i]){
                  d[to[i]]=d[x]+cost[i];
                  pre[to[i]]=i;
                  flow=min(flow,f[i]);
                  if(!iq[to[i]]){
                    if(d[to[i]]>d[q[fi]])q[++la]=to[i];
                      else q[--fi]=to[i];
                    iq[to[i]]=1;
                  }
              }
            } 
          }
          if(d[t]>=inf)return;
          int wh=pre[t];
          while(wh){
              f[wh]-=flow;
              f[ath[wh]]+=flow;
              Ans+=flow*cost[wh];
              wh=pre[fr[wh]];
          }
        }
    }
    inline int ra(){
        int x=0,f=1;char s=getchar();
        while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
        while(isdigit(s))x=(x<<3)+(x<<1)+(s-'0'),s=getchar();
        return x*f;
    }
    int main(){
        register int i;
        n=ra(),m=ra();
        s=0,t=n+2;
        for(i=1;i<=n;++i){
          int x;
          x=ra();
          add(i,i+1,inf-x,0);
        }
        add(s,1,inf,0),add(n+1,n+2,inf,0);
        for(i=1;i<=m;++i){
          int x,y,z;
          x=ra(),y=ra(),z=ra();
          add(x,y+1,inf,z);
        }
        go();
        printf("%d
    ",Ans);
        return 0;
    }
  • 相关阅读:
    MySQL事务隔离级别和MVCC
    windows环境下查看端口是否被占用
    jar找不到问题解决
    Java注解
    Fastjson
    mybatis
    Idea快捷键
    Date与String的相互转换
    Windows快捷键
    [转]linux awk命令详解
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9973454.html
Copyright © 2011-2022 走看看