bzoj1927 [Sdoi2010]星际竞速 费用流

  
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 1604
#define maxm 60002
#define inf 0x3fffffff
#define s(a) ((a<<1)-1)
#define t(a) (a<<1)
int u[maxm],c[maxm],e[maxn],vis[maxn],v[maxm],ne[maxm];
int nn=1;
void add(int x,int y,int cc,int uu){
   ne[++nn]=e[x],e[x]=nn,v[nn]=y,c[nn]=cc,u[nn]=uu;
}
int cost;
int phi;
int S,T;
int n,mm;
int tt;
int ff;
int zeng(int no,int m){
    if(no==T)return cost+=phi*m,m;
    vis[no]=ff;
    int r=m,k;
    for(int i=e[no];i&&r;i=ne[i])if(!c[i]&&u[i]&&ff!=vis[v[i]]){
        k=zeng(v[i],min(r,u[i]));
        r-=k;
        u[i]-=k;
        u[i^1]+=k;
    }
    return m-r;
}
bool modlab(){
    int d=inf;
    for(int i=1;i<=T;i++)if(ff==vis[i]){
        for(int j=e[i];j;j=ne[j])if(u[j]&&ff!=vis[v[j]]&&c[j]<d)d=c[j];
    }
    if(d==inf)return 0;
    for(int i=1;i<=T;i++)if(ff==vis[i]){
      for(int j=e[i];j;j=ne[j])c[j]-=d,c[j^1]+=d;  
    }
    phi+=d;
    return 1;
}
int main(){
    scanf("%d%d",&n,&mm);
    S=(n<<1)+1;
    T=S+1;
    int a,b,z;
    for(int i=1;i<=n;i++){
      scanf("%d",&a);
      add(S,s(i),a,1);
      add(s(i),S,-a,0);
      add(S,t(i),0,1);
      add(t(i),S,0,0);
      add(s(i),T,0,1);
      add(T,s(i),0,0);
    }
    for(int i=1;i<=mm;i++){
        scanf("%d%d%d",&a,&b,&z);
        if(a>b)swap(a,b);
        add(t(a),s(b),z,1);
        add(s(b),t(a),-z,0);
    }
    do do ff++;
    while(zeng(S,inf));
    while(modlab());
    cout<<cost;
     
}
posted @ 2014-04-01 16:55  wangyucheng  阅读(168)  评论(0编辑  收藏  举报