Cod sursa(job #1613198)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 25 februarie 2016 11:30:32
Problema Cuplaj maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.48 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>

#define DIM 305
#define INF (1 << 30)

using namespace std;

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

int D[2*DIM], T[2*DIM], cost[2*DIM][2*DIM], capacity[2*DIM][2*DIM], F[2*DIM][2*DIM], muchii[2*DIM][2*DIM];
int N, M, E, x, y, c, d, flux, solution, Fmin;

vector<int>L[2*DIM];
queue <int>Q;
bitset<DIM>v;

bool BF()
{
    v.reset();
    for(int i = 1; i <= N + M + 1; i ++)
    {
        D[i] = INF;
    }

    Q.push(0);

    while(!Q.empty())
    {
        int nod = Q.front();
        v[nod] = 0;
        Q.pop();

        for(int i = 0; i < L[nod].size(); i ++)
        {
            int vecin = L[nod][i];

            if( (D[vecin] > D[nod] + cost[nod][vecin]) && (capacity[nod][vecin] > F[nod][vecin]) )
            {
                D[vecin] = D[nod] + cost[nod][vecin];
                T[vecin] = nod;

                if(v[vecin] == 0)
                {
                    v[vecin] = 1;
                    Q.push(vecin);
                }
            }
        }
    }

    return (D[d] != INF);
}

int main()
{
    fin >> N >> M >> E;

    for(int i = 1; i <= E; i ++)
    {
        fin >> x >> y >> c;
        L[x].push_back(N + y);
        L[N + y].push_back(x);

        capacity[x][N + y] = 1;
        cost[x][N + y] = c;
        cost[N + y][x] = -c;
        muchii[x][N + y] = i;
    }

    for(int i = 1; i <= N; i ++)
    {
        capacity[0][i] = 1;
        L[0].push_back(i);
        L[i].push_back(0);
    }
    for(int i = N + 1; i <= M + N; i ++)
    {
        capacity[i][N + M + 1] = 1;
        L[i].push_back(N + M + 1);
        L[N + M + 1].push_back(i);
    }

    d = N + M + 1;

    while(BF())
    {
        x = d;

        Fmin = INF;

        while(x)
        {
            Fmin = min(Fmin, capacity[T[x]][x] - F[ T[x] ][x]);
            x = T[x];
        }

        x = d;

        while(x)
        {
            solution += Fmin * cost[ T[x] ][x];
            F[T[x]][x] += Fmin;
            F[x][T[x]] -= Fmin;
            x = T[x];
        }
        flux += Fmin;
    }


        fout << flux << " " << solution << '\n';

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

    return 0;
}