Cod sursa(job #1333948)

Utilizator wGEORGEWGeorge Cioti wGEORGEW Data 3 februarie 2015 19:28:01
Problema Cc Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define Nmax 205
#define pb push_back
#define INF 2147000000
 
using namespace std;
 
queue< int > Q;
vector< int > v[Nmax];
int F[Nmax][Nmax],C[Nmax][Nmax],Cost[Nmax][Nmax];
int inq[Nmax],H[Nmax],poz[Nmax],Dist[Nmax],prev[Nmax];
int n,Rez,dh;
 
inline int Minim(int x,int y){ return x<y ? x:y; }
inline void swap(int i,int j){
    int aux=H[i]; H[i]=H[j]; H[j]=aux;
    poz[H[i]]=i;
    poz[H[j]]=j;
}
 
inline void Up(int k){
    while( k/2 && Dist[H[k/2]] > Dist[H[k]] ){
        swap(k,k/2);
        k/=2;
    }
}
 
inline void Down(int k){
    int x=0;
    while( x!= k ){
        x=k;
        if( 2*x<=dh && Dist[H[2*x]] < Dist[H[k]] ) k=2*x;
        if( 2*x+1<=dh && Dist[H[2*x+1]] < Dist[H[k]] ) k=2*x+1;
         
        swap(x,k);
    }
}
 
void dijkstra(){
    int i,pmin,fmin; vector< int >:: iterator it;
     
    for(i=1;i<=2*n+2;++i) Dist[i]=INF, H[i]=i, poz[i]=i, prev[i]=-1;
    dh=2*n+2;
    Dist[2*n+2]=0; Up(2*n+2);
     
    while( dh && Dist[H[1]]!=INF ){
        pmin=H[1];
        swap(1,dh);
        dh--;
        Down(1);
         
        for(it=v[pmin].begin(); it!=v[pmin].end(); ++it)
            if( C[pmin][*it] > F[pmin][*it] && Dist[*it] > Dist[pmin]+Cost[pmin][*it]){
                Dist[*it]=Dist[pmin]+Cost[pmin][*it];
                Up(poz[*it]);
                prev[*it]=pmin;
            }
    }
     
    if( Dist[2*n+1] != INF ){
        fmin=INF;
        for( i=2*n+1; i!=2*n+2; i=prev[i] )
            fmin=Minim(fmin,C[prev[i]][i]-F[prev[i]][i]);
 
        for( i=2*n+1; i!=2*n+2; i=prev[i] ){
            F[prev[i]][i] += fmin;
            F[i][prev[i]] -= fmin;
        }
         
        Rez += Dist[2*n+1];
    }
}       
 
int main(){
    int i,j;
    freopen("cc.in","r",stdin);
    freopen("cc.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j){
            scanf("%d",&Cost[i][n+j]);
            Cost[n+j][i]=-Cost[i][n+j];
            C[i][n+j]=1; C[n+j][i]=0;
             
            v[i].pb(n+j); v[n+j].pb(i);
        }
     
    // sursa 2*n+2 destinatia 2*n+1
    for(i=1;i<=n;++i) v[2*n+2].pb(i), C[2*n+2][i]=1, Cost[2*n+2][i]=0;
    for(i=n+1;i<=2*n;++i) v[i].pb(2*n+1), C[i][2*n+1]=1, Cost[i][2*n+1]=0;
     
    for(i=1;i<=n;++i)
        dijkstra();
 
     
    printf("%d\n",Rez);
    fclose(stdin); fclose(stdout);
    return 0;
}