Cod sursa(job #2480207)

Utilizator TheSeekerRobert Cristian Dobra TheSeeker Data 25 octombrie 2019 05:35:21
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <fstream>
#include <vector>
#include <deque>
#define DIM 620
#define INF 2147483647
using namespace std;

ifstream fin ("cmcm.in");
ofstream fout("cmcm.out");

int n,m,a,e,i,j,gasit,nod,vecin,cost,sol,v[DIM],ok[DIM],T[DIM],C[DIM][DIM],F[DIM][DIM],D[DIM],Z[DIM][DIM],x,y,z,k,im[DIM][DIM];
vector<int> L[DIM];
deque<int> q;

int bf(){
    gasit=0;
    for (i=1;i<=a;i++){
        ok[i]=0;
        D[i]=INF;
    }
    D[0]=0;
    ok[0]=1;
    q.push_back(0);
    while (!q.empty()){
        nod=q.front();
        q.pop_front();
        ok[nod]=0;
        for (unsigned int i=0;i<L[nod].size();i++){
            vecin=L[nod][i];
            cost=Z[nod][vecin];
            if (C[nod][vecin]>F[nod][vecin] && D[nod]+cost<D[vecin]){
                T[vecin]=nod;
                D[vecin]=D[nod]+cost;
                if (!ok[vecin]){
                    ok[vecin]=1;
                    q.push_back(vecin);
                    if (vecin==a)
                        gasit=1;
                }
            }
        }
    }
    return gasit;
}

int main(){
    fin>>n>>m>>e;
    for (i=1;i<=e;i++){
        fin>>x>>y>>z;
        L[x].push_back(n+y);
        L[n+y].push_back(x);
        C[x][n+y]=1;
        Z[x][n+y]=z;
        Z[n+y][x]=-z;
        im[x][n+y]=i;
    }
    a=n+m+1;
    for (i=1;i<=n;i++){
        L[0].push_back(i);
        L[i].push_back(0);
        C[0][i]=1;
    }
    for (i=1;i<=m;i++){
        L[a].push_back(n+i);
        L[n+i].push_back(a);
        C[n+i][a]=1;
    }
    while (bf()){
        for (nod=a;nod!=0;nod=T[nod]){
            F[T[nod]][nod]++;
            F[nod][T[nod]]--;
        }
        sol+=D[a];
    }
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
            if (F[i][n+j]==1)
                v[++k]=im[i][n+j];
    fout<<k<<" "<<sol<<'\n';
    for (i=1;i<=k;i++)
        fout<<v[i]<<" ";
    fin.close();
    fout.close();
    return 0;
}