Cod sursa(job #1518010)

Utilizator robx12lnLinca Robert robx12ln Data 5 noiembrie 2015 10:25:37
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include<fstream>
#include<deque>
#include<vector>
#define DIM 705
#define INF 1000000000
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
int Z[DIM][DIM] , C[DIM][DIM] , F[DIM][DIM] , P[DIM][DIM];
int V[DIM] , T[DIM] , D[DIM] ,s,d,n,e,m;
vector<int> L[DIM];
deque<int> q;
int bf(){
    int nod,vecin,ok=0;
    for(int i=1;i<=d;i++){
        D[i]=INF;
    }
    q.push_back(s);
    D[s]=0;
    V[s]=1;
    while( !q.empty() ){
        nod = q.front();
        for(int i=0 ; i<L[nod].size() ; i++ ){
            vecin=L[nod][i];
            if( C[nod][vecin] > F[nod][vecin] && D[vecin] > D[nod] + Z[nod][vecin] ){
                D[vecin] = D[nod] + Z[nod][vecin];
                T[vecin]=nod;
                if( V[vecin] == 0){
                    V[vecin] = 1;
                    q.push_back(vecin);
                    if(vecin == d) ok=1;
                }
            }

        }
        q.pop_front();
        V[nod]=0;
    }
    return ok;
}
int x,y,c,minim,flux,cost;
int main(){
    fin>>n>>m>>e;
    for(int i=1;i<=e;i++){
        fin>>x>>y>>c;
        //
        L[x].push_back(y+n);
        L[y+n].push_back(x);
        C[x][y+n] =  1;
        Z[x][y+n] =  c;
        Z[y+n][x] = -c;
        P[x][y+n] =  i;
        //
    }
    for(int i=1;  i<=n ;i++ ){
        L[0].push_back(i);
        L[i].push_back(0);
        C[0][i] = 1;
        Z[x][0] = Z[0][x] = 0;
    }
    s=0;
    d=n+m+1;
    for(int i = 1; i <= m ; i++ ){
        L[d].push_back(i+n);
        L[i+n].push_back(d);
        C[i+n][d]=1;
    }

    while( bf() == 1 ){

        minim = INF;

        for( int i = d ; i != s ; i=T[i] ){
            minim=min(minim , C[ T[i] ][i] - F[ T[i] ][i] );
        }
        flux+=minim;
        for( int i = d ; i != s ; i=T[i] ){
            F[ T[i] ][i] += minim;
            F[i][ T[i] ] -= minim;
            cost += minim * Z[ T[i] ][i];
        }

    }
    fout<<flux<<" "<<cost<<"\n";
    for(int i=1 ; i<=n ; i++ ){
        for(int j = n+1 ; j <= m+n ; j++ ){
            if( F[i][j]  == 1 ){
                fout<<P[i][j]<<" ";
            }
        }
    }
    return 0;
}