Cod sursa(job #1529488)

Utilizator sebinechitasebi nechita sebinechita Data 20 noiembrie 2015 22:54:31
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
#define MAX 610
#define INF 1000000000
#define cout fout
int C[MAX][MAX], Ca[MAX][MAX];
typedef vector <int> :: iterator iter;
vector <int> G[MAX];
queue <int> Q;

int n, m, maxflow, dist[MAX], inQ[MAX], F[MAX][MAX], dad[MAX];
int muchie[MAX][MAX];
int bf()
{
    int i, nod, flow;
    for(i = 1 ; i <= n + m + 1 ; i++)
    {
        dist[i] = INF;
    }
    dist[0] = 0;
    Q.push(0);
    while(Q.size())
    {
        nod = Q.front();
        inQ[nod] = 0;
        Q.pop();
        for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
        {
            if(Ca[nod][*it] > F[nod][*it] && dist[*it] > dist[nod] + C[nod][*it])
            {
                dist[*it] = dist[nod] + C[nod][*it];
                dad[*it] = nod;
                if(!inQ[*it])
                {
                    Q.push(*it);
                    inQ[*it] = 1;
                }
            }
        }
    }
    //cout << dist[n + m + 1];
    if(dist[n + m + 1] == INF)
        return 0;
    flow = INF;
    for(i = n + m + 1 ; i ; i = dad[i])
    {
        flow = min(flow, Ca[dad[i]][i] - F[dad[i]][i]);
    }
    for(i = n + m + 1 ; i ; i = dad[i])
    {
        maxflow += flow * C[dad[i]][i];
        F[dad[i]][i] += flow;
        F[i][dad[i]] -= flow;
    }
    return 1;
}

int main()
{
    int e, i, x, y, c;
    fin >> n >> m >> e;
    for(i = 1 ; i <= n ; i++)
    {
        G[0].push_back(i);
        G[i].push_back(0);
        C[0][i] = 0;
        Ca[0][i] = 1;
    }
    for(i = 1 ; i <= m ; i++)
    {
        G[n + i].push_back(n + m + 1);
        G[n + m + 1].push_back(n + i);
        C[n + i][n + m + 1] = 0;
        Ca[n + i][n + m + 1] = 1;
    }
    for(i = 1 ; i <= e ; i++)
    {
        fin >> x >> y >> c;
        muchie[x][n + y] = i;
        G[x].push_back(n + y);
        G[n + y].push_back(x);
        Ca[x][n + y] = 1;
        C[x][n + y] = c;
        C[n + y][x] = -c;
    }
    while(bf())
    {

    }

    int s = 0;
    for(i = 1 ; i <= n ; i++)
        s += F[0][i];
    cout << s << " " << maxflow << "\n";
    for(i = 1 ; i <= n ; i++)
    {
        for(iter it = G[i].begin() ; it != G[i].end() ; it++)
        {
            if(*it > n && *it <= n + m && F[i][*it])
            {
                cout << muchie[i][*it] << " ";
            }
        }
    }
}