Cod sursa(job #1519414)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 7 noiembrie 2015 12:24:44
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
#include <iostream>
#define DIM 605

using namespace std;

int N,M,E;
int F[DIM][DIM],C[DIM][DIM],T[DIM],Z[DIM][DIM];
vector <int> v[DIM];
bitset <DIM> U;
queue <int> Q;
int order[DIM][DIM];
int D[DIM];
int final;
int cost,flux;
int edges;

ifstream fin("cmcm.in");
ofstream fout("cmcm.out");

int bf(){
    U.reset();
    U[0]=1;
    Q.push(0);
    for(int i=0;i<=final;i++)
        D[i]=0x3f3f3f3f;
    D[0]=0;
    while(!Q.empty()){
        int node = Q.front();
        U[node]=0;
        Q.pop();
        for(int i=0;i<v[node].size();i++){
            int vec = v[node][i];
            if(C[node][vec] > F[node][vec] && D[vec] > D[node] + Z[node][vec]){
                D[vec] = D[node] + Z[node][vec];
                T[vec] = node;
                if(U[vec]==0){
                    U[vec] = 1;
                    Q.push(vec);
                }
            }
        }
    }
    return D[final]!=0x3f3f3f3f;

}

int main(){

    fin >> N >> M >> E;

    for(int i=1;i<=E;i++){
        int x,y,z;
        fin >> x >> y >> z;
        C[x][N+y]=1;
        Z[x][N+y]=z;
        Z[N+y][x]=-z;
        order[x][N+y]=i;
        order[N+y][x]=i;
        v[x].push_back(N+y);
        v[N+y].push_back(x);
    }
    for(int i=1;i<=N;i++){
        v[0].push_back(i);
        v[i].push_back(0);
        C[0][i]=1;
    }
    final=N+M+1;
    for(int i=1;i<=M;i++){
        C[i+N][final]=1;
        v[i+N].push_back(final);
        v[final].push_back(i+N);
    }

    while(bf()){
        int minim = 0x3f3f3f3f;
        int u=final;
        while(u!=0){
            if(minim > C[T[u]][u] - F[T[u]][u])
                minim = C[T[u]][u] - F[T[u]][u];
            u=T[u];
        }
        u=final;
        flux+=minim;
        while(u!=0){
            cost += minim * Z[T[u]][u];
            F[T[u]][u]+=minim;
            F[u][T[u]]-=minim;
            u=T[u];
        }
    }

    fout << flux << " " << cost << "\n";

    for(int i=1;i<=N;i++)
        for(int j=1;j<=M;j++)
            if(F[i][j+N]!=0)
                fout << order[i][j+N] << " ";
}