Cod sursa(job #1264617)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 15 noiembrie 2014 22:58:12
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
#include <vector>
#include <queue>
#define inf (1<<30)

using namespace std;

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

int c[610][610],f[610][610],muchie[610][610],d[610],t[610],z[610][610];

vector<int> L[610];

int l,r,x,y,C,i,m,minim,sol,cost,j;

queue <int> q;

bool bf () {
    int fr,sc,s;
    for (int i=0;i<=l+r+1;i++)  {
        t[i]=0;
        d[i]=inf;
    }
    t[0]=-1;
    d[0]=0;
    q.push(0);
    while (q.size()) {
        int x=q.front();
        q.pop();
        for (int i=0;i<L[x].size();i++) {
            fr=L[x][i];sc=z[x][fr];
            if (d[x]+sc<d[fr] && c[x][fr]>f[x][fr]) {
                d[fr]=d[x]+sc;
                t[fr]=x;
                q.push(fr);
            }
        }

    }
    return (d[l+r+1]!=inf);
}



int main () {

    fin>>l>>r>>m;
    for (i=1;i<=m;i++) {
        fin>>x>>y>>C;
        L[x].push_back(l+y);
        L[l+y].push_back(x);
        c[x][l+y]=1;
        z[x][l+y]=C;
        z[l+y][x]=-C;
        muchie[x][l+y]=muchie[l+y][x]=i;
    }

    for (i=1;i<=l;i++) {
        L[0].push_back(i);
        L[i].push_back(0);
        c[0][i]=1;
    }
    for (i=1;i<=r;i++) {
        L[i+l].push_back(l+r+1);
        L[l+r+1].push_back(i+l);
        c[i+l][l+r+1]=1;
    }

    while (bf()) {

        x=t[l+r+1];

        if (c[x][l+r+1]>f[x][l+r+1]){
            minim=c[x][l+r+1]-f[x][l+r+1];
            while (t[x]!=-1){
                minim=min(minim,c[t[x]][x]-f[t[x]][x]);
                x=t[x];
            }
            x=t[l+r+1];
            f[x][l+r+1]+=minim;
            f[l+r+1][x]-=minim;
            while (t[x]!=-1){
                f[t[x]][x]+=minim;
                f[x][t[x]]-=minim;
                x=t[x];
            }
            sol+=minim;
            cost+=d[l+r+1]*minim;
        }
    }

    fout<<sol<<" "<<cost<<"\n";

    for (i=1;i<=l;i++)
        for (j=0;j<L[i].size()-1;j++)
            if (f[i][L[i][j]]==1)
                fout<<muchie[i][L[i][j]]<<" ";

    return 0;
}