Cod sursa(job #3304841)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 27 iulie 2025 20:47:42
Problema Cuplaj maxim de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <bits/stdc++.h>

using namespace std;

#define ST_DIO 0
#if ST_DIO
    #define fin cin
    #define fout cout
#else
    ifstream fin("txt.in");
    ofstream fout("txt.out");
#endif  // ST_DIO

const int INF = 1e9 + 7;
struct Muchie {
    int vec, cost;
};
int n, m, mch, i, j, st, sf, flux[62][62], rasp, idx[62][62];
int tata[62], cost[62];
vector<Muchie> gr[62];
set<int> traseu;
bool fr[62];

static inline bool Dijkastra() {
    for(int i = st; i <= sf; i++) cost[i] = INF;
    memset(fr, false, sizeof(fr));
    queue<int> q;

    cost[st] = 0;
    fr[st] = true;

    q.push(st);

    while(!q.empty()) {
        int nod = q.front();
        q.pop();

        fr[nod] = false;
        for(Muchie urm : gr[nod]) {
            int costUrm = urm.cost + cost[nod];
            if(costUrm < cost[urm.vec] && flux[nod][urm.vec] > 0) {
                cost[urm.vec] = costUrm;
                tata[urm.vec] = nod;

                if(!fr[urm.vec]) {
                    fr[urm.vec] = true;
                    q.push(urm.vec);
                }
            }
        }
    }

    return cost[sf] != INF;
}

static inline void BackTrack() {
    int cur = sf;
    int ma = 1;
    /*while(cur != st) {
        ma = min(ma, flux[tata[cur]][cur]);
        cur = tata[cur];
    }*/

    while(cur != st) {
        flux[tata[cur]][cur] -= ma;
        flux[cur][tata[cur]] += ma;

        int i = idx[tata[cur]][cur];
        if(i > 0) traseu.insert(i);
        else      traseu.erase(-i);

        cur = tata[cur];
    }
    rasp += cost[sf];
}

int main() {
    if(ST_DIO) ios_base::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr);

    fin >> n >> m >> mch;

    st = 0;
    sf = n + m + 1;

    for(i = 1; i <= mch; i++) {
        int x, y, c;
        fin >> x >> y >> c;
        y += n;
        gr[x].push_back({y,  c});
        gr[y].push_back({x, -c});

        idx[x][y] =  i;
        idx[y][x] = -i;

        flux[x][y] = 1;
    }

    for(i = 1; i <= n; i++) {
        gr[st].push_back({i, 0});
        gr[i].push_back({st, 0});
        flux[st][i] = 1;
    }
    for(i = n + 1; i <= n + m; i++) {
        gr[i].push_back({sf, 0});
        gr[sf].push_back({i, 0});
        flux[i][sf] = 1;
    }

    while(Dijkastra()) BackTrack();
    fout << traseu.size() << " " << rasp << "\n";
    for(int cur : traseu) fout << cur << " ";

    return 0;
}