Cod sursa(job #2419619)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 8 mai 2019 22:51:38
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 kb
#include <fstream>
#include <vector>
#include <deque>
#include <bitset>
#include <cstring>
#define DIM 1000
#define INF 2000000000
using namespace std;

ifstream fin ("cmcm.in");
ofstream fout ("cmcm.out");
vector <int> L[DIM];
deque <int> q;
bitset <DIM> viz;
int c[DIM][DIM],f[DIM][DIM],cst[DIM][DIM],mch[DIM][DIM],d[DIM],t[DIM];
int n,m,i,j,x,y,flux,sol,dif,cost,s,dest,e;
inline int bellmanFord(){

    for (int i=0;i<=dest;i++)
        d[i] = INF;
    memset (t,0,sizeof(t));
    viz.reset();
    q.push_back(s);
    viz[s] = 1;
    d[s] = 0;
    while (!q.empty()){
        int nod = q.front();
        viz[nod] = 0;
        q.pop_front();
        for (int i=0;i<L[nod].size();i++){
            int vecin = L[nod][i];
            if (c[nod][vecin] > f[nod][vecin] && d[nod]+cst[nod][vecin] < d[vecin]){
                d[vecin] = d[nod]+cst[nod][vecin];
                t[vecin] = nod;
                if (!viz[vecin]){
                    viz[vecin] = 1;
                    q.push_back(vecin);
                }}}}

    return (d[dest] != INF);
}
int main (){

    fin>>n>>m>>e;
    for (i=1;i<=e;i++){
        fin>>x>>y>>cost;
        L[x].push_back(y+n);
        L[y+n].push_back(x);
        cst[x][y+n] = cost;
        cst[y+n][x] = -cost;
        c[x][y+n] = 1;
        mch[x][y+n] = i;
    }

    for (i=1;i<=n;i++){
        L[0].push_back(i);
        L[i].push_back(0);
        c[0][i] = 1;
    }
    for (i=1;i<=m;i++){
        L[i+n].push_back(n+m+1);
        L[n+m+1].push_back(i+n);
        c[i+n][n+m+1] = 1;
    }
    s = 0, dest = n+m+1;
    while (bellmanFord()){

        x = dest;
        dif = INF;
        while (x != s){
            dif = min (dif,c[t[x]][x] - f[t[x]][x]);
            x = t[x];
        }
        flux += dif;
        x = dest;
        while (x != s){
            f[t[x]][x] += dif;
            f[x][t[x]] -= dif;
            sol += dif*cst[t[x]][x];
            x = t[x];
        }}

    fout<<flux<<" "<<sol<<"\n";
    for (i=1;i<=n;i++)
        for (j=n+1;j<dest;j++)
            if (f[i][j] == 1)
                fout<<mch[i][j]<<" ";

    return 0;
}