Cod sursa(job #2200404)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 1 mai 2018 12:00:13
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>
#define Nmax 603
using namespace std;

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

int n,p,q,m,e,c,S,D,mn[Nmax],cst,ans,NR[Nmax],ant[Nmax],fw[Nmax][Nmax],C[Nmax][Nmax];
bool inQ[Nmax];
vector<pair<int,int> > v[Nmax];

void belman(){
    memset(mn,0x3f,sizeof(mn));
    memset(ant,0xff,sizeof(ant));
    vector<int> H;
    H.push_back(S);
    mn[S] = 0;
    for (int i=0;i<H.size();i++){
        int nod = H[i];
        inQ[nod] = 0;
        for (auto it : v[nod]){
            if (!fw[nod][it.first]) continue;
            if (mn[it.first]>mn[nod]+C[nod][it.first]){
                mn[it.first] = mn[nod] + C[nod][it.first];
                ant[it.first] = nod;
                if (!inQ[it.first]){
                    H.push_back(it.first);
                    inQ[it.first] = 1;
                }
            }
        }
    }
}

bool flow(){
    if (mn[D]>1e9) return 0;

    int nod = D;
    while (nod!=S){
        cst += C[ant[nod]][nod];
        fw[ant[nod]][nod] = 0;
        fw[nod][ant[nod]] = 1;
        nod = ant[nod];
    }
    ans++;

    return 1;
}


int main()
{
    f>>n>>m>>e;
    S = n+m+1;
    D = n+m+2;
    for (int i=1;i<=e;i++){
        f>>p>>q>>c;
        q+=n;
        v[p].push_back({q,i});
        fw[p][q] = 1;
        C[p][q] = c;
        v[q].push_back({p,-1});
        fw[q][p] = 0;
        C[q][p] = -c;
    }
    for (int i=1;i<=n;i++){
        v[S].push_back({i,-1});
        fw[S][i] = 1;
        C[S][i] = 0;
    }
    for (int i=n+1;i<=n+m;i++){
        v[i].push_back({D,-1});
        fw[i][D] = 1;
        C[i][D] = 0;
    }

    belman();
    while(flow()){
        belman();
    }

    g<<ans<<' '<<cst<<'\n';
    for (int i=1;i<=n+m;i++){
        for (auto it : v[i]){
            if (!fw[i][it.first] && it.second>0) g<<it.second<<' ';
        }
    }

    return 0;
}