Cod sursa(job #2197437)

Utilizator andreiudilaUdila Andrei andreiudila Data 22 aprilie 2018 10:32:29
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("cmcm.in");
ofstream cout("cmcm.out");

vector<int> v[650];
int cap[650][650];
int cost[650][650],t[650],dmin[650];
int q[130000],viz[650],ind[650][650];
int x,y,c,z,n,m,s,d,i,j,flux,costf,e;
int inf = 2000000000;
int cmin = inf;
bool drum_minim(int s, int d)
{
    int st = 1,en=1;
    q[st] = s;
    t[s]=-1;
    dmin[s]=0;
    for(int i=1;i<=n+m+1;++i)
            dmin[i]=inf;

    while(st<=en)
    {
        int nod = q[st];
        ++st;

        for(int i=0;i<v[nod].size();++i)
        {
            if(cap[nod][v[nod][i]] > 0
               && dmin[nod] + cost[nod][v[nod][i]] < dmin[v[nod][i]])
            {
                    dmin[v[nod][i]] = dmin[nod] + cost[nod][v[nod][i]];
                    ++en;
                    q[en]=v[nod][i];
                    t[v[nod][i]] = nod;
            }
        }
    }

    if(dmin[d] != inf) return 1;
    return 0;
}
int main()
{
    cin>>n>>m>>e;
    for(i=1;i<=e;++i)
    {
        cin>>x>>y>>z;
        y+=n;
        ind[x][y]=i;
        v[x].push_back(y);
        cost[x][y]=z;
        v[y].push_back(x);
        cost[y][x]=-z;
        cap[x][y]=1;
        cap[y][x]=0;
    }
    for(i=1;i<=n;++i)
    {
        v[0].push_back(i);
        v[i].push_back(0);
        cap[0][i]=1;
        cap[i][0]=0;

    }

    for(i=n+1;i<=n+m;++i)
    {
        v[n+m+1].push_back(i);
        v[i].push_back(n+m+1);
        cap[i][n+m+1]=1;
    }

    s=0;
    d=n+m+1;
    int nod = d;
    while(drum_minim(s,d))
    {
        nod = d;
        cmin = inf;
        while(nod != s)
        {
            cmin = min(cmin,cap[t[nod]][nod]);
            nod = t[nod];
        }

        flux += cmin;
        costf += dmin[d]*cmin;

        nod = d;
        while(nod !=s)
        {
            cap[nod][t[nod]] += cmin;
            cap[t[nod]][nod] -= cmin;
            nod = t[nod];
        }

    }

    cout<<flux<<" " << costf<<"\n";
    for(i=1;i<=n;++i)
        for(j=n+1;j<=n+m;++j)
    {
        if(cap[i][j] == 0 && cap[j][i]==1)
            cout<<ind[i][j]<<" ";
    }
    return 0;
}