zoukankan      html  css  js  c++  java
  • BZOJ3118 : Orz the MST

    对于树边显然只需要减少权值,对于非树边显然只需要增加权值

    设i不为树边,j为树边

    X[i]:i增加量

    X[j]:j减少量

    C[i]:修改1单位i的代价

    对于每条非树边i(u,v),在树上u到v路径上的所有边j都需要满足

    $W_i+X_igeq W_j-X_j$

    $X_i+X_jgeq W_j-W_i$

    最后我们要最小化$sum C_iX_i$

    将矩阵转置,得到对偶问题,用线性规划单纯形法求解

    #include<cstdio>
    #define rep(i,l,n) for(int i=l;i<=n;i++)
    const int N=1001,M=4000,inf=~0U>>2;
    int n,m,a[N][M],nxt[M],s,t,c,nn;
    int g[N],Nxt[N],v[N],ed,pre[N],id[N][N],head,tail,q[N];
    inline void cal(int l,int e){
      a[l][e]=-1;t=M-1;
      rep(i,0,m)if(a[l][i])nxt[t]=i,t=i;nxt[t]=-1;
      rep(i,0,n)if(i!=l&&(t=a[i][e])){
        a[i][e]=0;
        for(int j=nxt[M-1];~j;j=nxt[j])a[i][j]+=a[l][j]*t;
      }
    }
    int work(){
      for(;;){int min=inf,l=0,e=0;
        rep(i,1,m)if(a[0][i]>0){e=i;break;}
        if(!e)return a[0][0];
        rep(i,1,n)if(a[i][e]<0&&a[i][0]<min)min=a[i][0],l=i;
        cal(l,e);
      }
    }
    struct Edge{int u,v,w,f,a,b,c;}E[N];
    inline void add(int x,int y,int z){v[++ed]=y;id[x][y]=z;Nxt[ed]=g[x];g[x]=ed;}
    inline void bfs(int X,int y,int z){
      int i,x;
      for(i=1;i<=nn;i++)pre[i]=0;
      q[head=tail=0]=X;
      while(head<=tail)for(i=g[x=q[head++]];i;i=Nxt[i])if(!pre[v[i]]&&v[i]!=X)pre[q[++tail]=v[i]]=x;
      for(;pre[y];y=pre[y]){
        ++m;
        i=id[y][pre[y]];
        a[z][m]=a[i][m]=-1;
        a[0][m]=E[i].w-E[z].w;
      }
    }
    int main(){
      scanf("%d%d",&nn,&n);
      rep(i,1,n){
        scanf("%d%d%d%d%d%d",&E[i].u,&E[i].v,&E[i].w,&E[i].f,&E[i].a,&E[i].b);
        E[i].c=E[i].f?E[i].b:E[i].a;
        if(E[i].f)add(E[i].u,E[i].v,i),add(E[i].v,E[i].u,i);
      }
      rep(i,1,n)if(!E[i].f)bfs(E[i].u,E[i].v,i);
      rep(i,1,n)a[i][0]=E[i].c;
      return printf("%d",work()),0;
    }
    

      

  • 相关阅读:
    二分匹配
    第k短路
    2015_10
    The 15th Zhejiang University Programming Contest
    2015_8
    hdu 1565
    istringstream 用法
    floyd 闭包传递 判断两个点是否属于同一个 强连通分量
    Sicily 1866.Gene Reprogram 一种经典的hash方法
    zoj 3130 最小费用最大流 (求 s到e 的两条总花费最少的 完全没有交点的 路径)
  • 原文地址:https://www.cnblogs.com/clrs97/p/4403183.html
Copyright © 2011-2022 走看看