Cod sursa(job #769292)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 18 iulie 2012 22:03:34
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.53 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

#define MAX 605
#define INF 0x3f3f3f3f

using namespace std;

vector< pair < int , int > > v[MAX];
vector< pair < int , int > > muchii;
pair< int , int > cf[MAX][MAX];
int dist[MAX], inQueue[MAX], dad[MAX]; queue<int> q;
int n, m, e, s, d;

int bellmanFord()
{
    memset(inQueue, 0, MAX * sizeof(int));
    memset(dad, 0, MAX * sizeof(int));
    memset(dist, INF, MAX * sizeof(int));
    dist[s] = 0; q.push(s); inQueue[s] = 1;
    int nod, dst;
    while(!q.empty())
    {
        nod = q.front(); q.pop(); inQueue[nod] = 0;
        for(int i = 0; i < v[nod].size(); i++)
        {
            dst = v[nod][i].first;
            if(cf[nod][dst].first != cf[nod][dst].second && dist[dst] > dist[nod] + v[nod][i].second)
            {
                dist[dst] = dist[nod] + v[nod][i].second;
                dad[dst] = nod;
                if(!inQueue[dst])
                {
                    q.push(dst); inQueue[dst] = 1;
                }
            }
        }
    }
    if(dist[d] != INF)
    {
        int nod = d;
        while(nod != s)
        {
            cf[dad[nod]][nod].second++;
            cf[nod][dad[nod]].second--;
            nod = dad[nod];
        }
        return dist[d];
    }
    return 0;
}

pair<int, int> cuplaj()
{
    int c = 0, rep = 0, val;
    while((val = bellmanFord()) != 0)
    {
        c += val;
        rep++;
    }
    return make_pair(rep, c);
}

int main()
{
    int a, b, c;
    ifstream in("cmcm.in"); in>>n>>m>>e;
    for(int i = 1; i <= e; i++)
    {
        in>>a>>b>>c; b += n;
        v[a].push_back(make_pair(b, c));
        v[b].push_back(make_pair(a, -c));
        cf[a][b] = make_pair(1, 0); cf[b][a] = make_pair(0, 0);
        muchii.push_back(make_pair(a, b));
    }
    in.close();
    s = 0; d = n + m + 1;
    for(int i = 1; i <= n; i++)
    {
        v[s].push_back(make_pair(i, 0)); v[i].push_back(make_pair(s, 0));
        cf[s][i] = make_pair(1, 0); cf[i][s] = make_pair(0,0);
    }
    for(int i = n + 1; i <= m + n; i++)
    {
        v[i].push_back(make_pair(d, 0)); v[d].push_back(make_pair(i, 0));
        cf[i][d] = make_pair(1, 0); cf[d][i] = make_pair(0, 0);
    }
    pair< int , int > rez = cuplaj();
    ofstream out("cmcm.out"); out<<rez.first<<" "<<rez.second<<'\n';
    for(int i = 0; i < muchii.size(); i++)
    {
        if(cf[muchii[i].first][muchii[i].second].second == 1) out<<i + 1<<" ";
    }
    out.close();
    return 0;
}