Cod sursa(job #2698683)

Utilizator Danut200333Dumitru Daniel Danut200333 Data 22 ianuarie 2021 19:58:32
Problema Cuplaj maxim de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
int f[1100][1100],c[1100][1100],cost[1100][1100],d[1100],tata[1100];
int S,D,n,m,x,y,z,cc,nr,E;
bool ver[1100];
vector <int> v[1100];
int bmf(){
    queue <int> q;
    for(int i=1;i<=n+m+2;i++){
        d[i]=600000000;
        ver[i]=false;
    }
    q.push(S);
    ver[S]=true;
    d[S]=0;
    while(!q.empty()){
        int nod=q.front();
        ver[nod]=false;
        q.pop();
        if(nod==D) continue;
        for(int i=0;i<v[nod].size();i++){
            int vecin=v[nod][i];
            if(c[nod][vecin]>f[nod][vecin] and d[vecin]>d[nod]+cost[nod][vecin]){
                d[vecin]=d[nod]+cost[nod][vecin];
                if(ver[vecin]==false){
                    ver[vecin]=true;
                    q.push(vecin);
                }
                tata[vecin]=nod;
            }
        }
    }
    if(d[D]!=600000000){
        int minim=600000000;
        nr=1;
        for(int i=D;i!=S;i=tata[i]) minim=min(minim,c[tata[i]][i]-f[tata[i]][i]);
        for(int i=D;i!=S;i=tata[i]) {
            f[tata[i]][i]+=minim;
            f[i][tata[i]]-=minim;
        }
        return minim*d[D];
    }
    return 0;
}
int main()
{
    fin >> n >> m >> E;
    S=n+m+1;
    D=S+1;
    for(int i=1;i<=n;i++){
        v[S].push_back(i);
        c[S][i]=1;
        cost[S][i]=0;
    }
    for(int i=1;i<=m;i++){
        v[n+i].push_back(D);
        c[n+i][D]=1;
        cost[n+i][D]=0;
    }
    for(int i=1;i<=E;i++){
        fin >> x >> y >> z;
        y+=n;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=1;
        cost[x][y]=z;
        cost[y][x]=-z;
    }
    int sol=0,cnt=-1;
    nr=1;
    while(nr==1){
        nr=0;
        sol+=bmf();
        cnt++;
    }
    fout << cnt << ' ' << sol << '\n';
    for(int i=1;i<=E;i++)if(f[x][y+n]>0) fout << i << ' ';
    return 0;
}