Cod sursa(job #253440)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 5 februarie 2009 19:51:42
Problema Flux maxim de cost minim Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>
#define Inf 99999999
int N,K,A,B,source,sink;
int v[606],r[606][606],c[606][606];
int abs(int x){
    return x>0?x:-x;
    }
int q[606*606],prim,ult;
char u[606];
int d[606],t[606];
int drum(){
    int i,j;
    for (i=0;i<=N+B-A+2;++i){
        u[i]=0;
        d[i]=Inf;
        t[i]=0;}
    u[source]=1;
    d[source]=0;
    t[source]=source;
    q[prim=ult=1]=source;
    while (prim<=ult){
      i=q[prim++];
      u[i]=0;
      for (j=0;j<=N+B-A+2;++j)
       if (r[i][j]>0)
        if (d[j]>d[i]+c[i][j]){
         d[j]=d[i]+c[i][j];
         t[j]=i;
         if (!u[j]){
           u[j]=1;
           q[++ult]=j;}
           }
       }
    
    for (i=sink;i!=t[i];i=t[i]){
     r[t[i]][i]--;
     r[i][t[i]]++;}

    return d[sink];   
     }
int main(){
    int i,j,k;
    freopen("smen.in","r",stdin);
    freopen("smen.out","w",stdout);
    scanf("%d %d %d %d",&N,&K,&A,&B);
    for (i=1;i<=N;++i) scanf("%d",&v[i]);
    
    for (i=1;i<=B-A+1;++i) v[N+i]=A+i-1;
    source=0;sink=i+N;
    for (i=1;i<=N;++i) r[source][i]=1;
    for (i=1;i<=N;++i)
     for (j=N+1;j<=N+B-A+1;++j){
      r[i][j]=1;
      c[i][j]=abs(v[i]-v[j]);
      c[j][i]=-c[i][j];}
    for (i=N+1;i<=N+B-A+1;++i)
      r[i][sink]=1;
    
    j=0;
    for (i=1;i<=K;++i)
     j+=drum();
    
    printf("%d\n",j);
    for (i=1;i<=N;++i){
     k=v[i];
     for (j=N+1;j<=N+B-A+1;++j)
      if (r[i][j]==0) k=v[j];
     printf("%d ",k);
     }
    return 0;
}