Cod sursa(job #2695632)

Utilizator anacomoAna-Maria Comorasu anacomo Data 14 ianuarie 2021 00:04:12
Problema Cuplaj maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.18 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
const int MAXN = 601, INF = 2e9;

int n, m, e, d;
int nr, min_cost;
vector<int> adj[MAXN];
int cost[MAXN][MAXN], c[MAXN][MAXN], edges[MAXN][MAXN], dst[MAXN], par[MAXN];
bool inQ[MAXN];
queue<int> qu;

bool BellmanFord()
{
    for (int i = 1; i < MAXN; ++i)
        dst[i] = INF;
    dst[0] = 0;
    qu.push(0);
    inQ[0] = true;
    while (!qu.empty())
    {
        int node = qu.front();
        inQ[node] = false;
        qu.pop();
        for (auto nbh : adj[node])
            if (c[node][nbh] && dst[nbh] > dst[node] + cost[node][nbh])
            {
                dst[nbh] = dst[node] + cost[node][nbh];
                par[nbh] = node;
                if (!inQ[nbh])
                {
                    qu.push(nbh);
                    inQ[nbh] = true;
                }
            }
    }
    return (dst[d] != INF);
}
void compute()
{
    int minF, node;
    while (BellmanFord())
    {
        minF = INF;
        node = d;
        while (node != 0)
        {
            minF = min(minF, c[par[node]][node]);
            node = par[node];
        }

        nr += minF;
        min_cost += minF * dst[d];
        node = d;
        while (node != 0)
        {
            c[par[node]][node] -= minF;
            c[node][par[node]] += minF;
            node = par[node];
        }
    }
}

int main()
{
    fin >> n >> m >> e;
    d = n + m + 1;
    int P, qu, cst;
    for (int i = 1; i <= e; ++i)
    {
        fin >> P >> qu >> cst;
        qu += n;
        edges[P][qu] = i;
        adj[P].push_back(qu);
        adj[qu].push_back(P);
        cost[P][qu] = cst;
        cost[qu][P] = -cst;
        c[P][qu] = 1;
    }

    for (int i = 1; i <= n; ++i)
    {
        adj[0].push_back(i);
        adj[i].push_back(0);
        c[0][i] = 1;
    }
    for (int i = n + 1; i <= m + n; ++i)
    {
        adj[i].push_back(d);
        adj[d].push_back(i);
        c[i][d] = 1;
    }

    compute();
    fout << nr << ' ' << min_cost << '\n';
    for (int i = 1; i <= n; ++i)
        for (int j = n + 1; j <= m + n; ++j)
            if (!c[i][j] && edges[i][j])
                fout << edges[i][j] << " ";
    return 0;
}