Cod sursa(job #1174364)

Utilizator misinozzz zzz misino Data 22 aprilie 2014 17:09:08
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>

#define INF 0x3f3f3f3f
#define N 620

using namespace std;

ifstream f("cmcm.in");
ofstream g("cmcm.out");

int n,m,k,i,mini,j,x,y,c,dest,flux,cost,cap[N][N],fl[N][N],d[N],t[N],viz[N],mu[N][N];

queue<int>q;

vector<pair<int,int > > v[N];

inline bool bellman_ford(){
    memset(d,INF,sizeof(d));
    memset(viz,0,sizeof(viz));

    d[0] = 0;
    viz[0] = 1;

    q.push(0);

    while(!q.empty())
    {
        x = q.front();
        q.pop();
        viz[x] = 0;

        for(vector<pair<int,int> >::iterator it = v[x].begin() ; it != v[x].end() ; ++ it)
        {
            if(d[x] + it->second >= d[it->first] || cap[x][it->first] == fl[x][it->first])
                continue;

            d[it->first] = d[x] + it->second;
            t[it->first] = x;

            if(!viz[it->first])
            {
                viz[it->first] = 1;
                q.push(it->first);
            }
        }
    }
    return d[dest] != INF;
}

inline void flux_maxim_de_cost_minim(){
    while(bellman_ford())
    {
        x = dest;
        mini = INF;

        while(x)
        {
            ++ fl[t[x]][x];
            -- fl[x][t[x]];
            x = t[x];
        }
        ++ flux;
        cost += d[dest];
    }
}

int main()
{
    f >> n >> m >> k;
    dest = n + m + 1;
    for(i = 1 ; i <= k ; ++ i)
    {
        f >> x >> y >> c;

        y += n;

        v[x].push_back(make_pair(y , c));
        v[y].push_back(make_pair(x , -c));

        cap[x][y] = 1;
        mu[x][y] = i;

        v[0].push_back(make_pair(x , 0));
        cap[0][x] = 1;

        v[y].push_back(make_pair(dest , 0));
        cap[y][dest] = 1;

    }

    flux_maxim_de_cost_minim();

    g << flux << ' ' << cost << '\n';

    for(i = 1 ; i <= n ; ++ i)
        for(j = n + 1 ; j < dest ; ++ j)
        if(fl[i][j])
        g << mu[i][j] << ' ';
    g<<'\n';
    return 0;
}