Cod sursa(job #1613087)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 25 februarie 2016 10:41:36
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include<cstdio>
#include<vector>
#include<queue>
#define INF 1000000000
using namespace std;
vector<int>L[610];
queue<int>q;
int n,m,p,e,i,j,a,b,aa,s,ss,vmin,c[610][610],x[610][610],w[610][610],d[610],z[610][610],v[610],t[610];
FILE *f,*g;
int bf(){
    for(i=1; i<=p; i++){
        d[i] = INF;
       // v[i] = 0;
        t[i] = 0;
    }
    q.push(0);
    d[0] = 0;
    v[0] = 1;
    t[0] = -1;
    while( !q.empty() ){
        a = q.front();
        q.pop();
        //v[a] = 0;
        for(int i=0; i<L[a].size(); i++){
            b=L[a][i];
            if( c[a][b] > w[a][b] && d[b] > d[a] + x[a][b] ){
                d[b] = d[a] + x[a][b];
                t[b] = a;
               // if( !v[b] ){
                   // v[b] = 1;
                    q.push(b);
                //}
            }
        }
    }
    return d[p] != INF;
}
int minim(int a,int b){
    if(a<b)
        return a;
    return b;
}
int main(){
    f=fopen("cmcm.in","r");
    g=fopen("cmcm.out","w");
    fscanf(f,"%d%d%d",&n,&m,&e);
    for(i=1;i<=e;i++){
        fscanf(f,"%d%d%d",&a,&b,&aa);
        L[a].push_back( b + n );
        L[ b + n ].push_back(a);
        c[a][ b + n ] = 1;
        x[a][ b + n ] = aa;
        x[ b + n ][a] = -aa;
        z[a][ b + n ] = z[ b + n ][a] = i;
    }
    for(i=1;i<=n;i++){
        c[0][i] = 1;
        L[0].push_back(i);
        L[i].push_back(0);
    }
    p = n + m + 1;
    for(i=1;i<=m;i++){
        c[ i + n ][p] = 1;
        L[ i + n ].push_back(p);
        L[p].push_back( i + n );
    }
    while( bf() ){
        a = t[p];
        if( c[a][p] > w[a][p] ){
            vmin = c[a][p] - w[a][p];
            while( t[a] != -1 ){
                vmin = minim( vmin , c[ t[a] ][a] - w[ t[a] ][a] );
                a = t[a];
            }
            a = p;
            while( t[a] != -1 ){
                w[ t[a] ][a] += vmin;
                w[a][ t[a] ] -= vmin;
                a = t[a];
            }
            s += vmin;
            ss += d[p]*vmin;
        }
    }
    fprintf(g,"%d %d\n",s,ss);
    for(i=1; i<=n; i++ ){
        for(j=0; j<L[i].size(); j++ ){
            if( w[i][ L[i][j] ] == 1 )
                fprintf(g,"%d ",z[i][ L[i][j] ]);
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}