Cod sursa(job #2695445)

Utilizator Johnny07Savu Ioan-Daniel Johnny07 Data 13 ianuarie 2021 00:44:46
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
#include<bits/stdc++.h>
#define inf 2147000000
using namespace std;
ifstream f("cmcm.in");
ofstream g("cmcm.out");

vector <int> v[605];
queue <int> q;
int n,n2,m;
int s,t,c[605][605],cost[605][605],fol[605][605],mx[50005],my[50005],use[605],ant[605],dmin[605];

int BellmanFord()
{
    int i,j,nod,nod2,newc;

    for(i=1; i<=t; i++)
    {
        use[i]=0;
        ant[i]=0;
        dmin[i]=inf;
    }

    q.push(s);
    dmin[s]=0;

    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        use[nod]=0;
        if (nod==t) continue;
        for(i=0; i<v[nod].size(); i++)
        {
            nod2=v[nod][i];
            newc=dmin[nod]+cost[nod][nod2];
            if (fol[nod][nod2]>=c[nod][nod2] || newc>=dmin[nod2]) continue;
            dmin[nod2]=newc;
            if (!use[nod2])
            {
                q.push(nod2);
                use[nod2]=1;
            }
            ant[nod2]=nod;
        }
    }

    return (dmin[t]!=inf);
}


void Flux()
{
    int i,x,res,sol=0,cmax=0;

    while(BellmanFord())
    {
        x=t;
        res=inf;
        while(ant[x])
        {
            res=min(res,c[ant[x]][x]-fol[ant[x]][x]);
            x=ant[x];
        }

        x=t;
        sol+=dmin[t]*res;
        while(ant[x])
        {
            fol[ant[x]][x]+=res;
            fol[x][ant[x]]-=res;
            x=ant[x];
        }

        cmax++;
    }

    g<<cmax<<" "<<sol<<"\n";

    for(i=1; i<=m; i++)
        if (fol[mx[i]][my[i]+n]>0)
            g<<i<<" ";
}

int main()
{
    int i,cst,nod,nod2;
    f>>n>>n2>>m;

    s=n+n2+1;
    t=s+1;
    for(i=1; i<=n; i++)
    {
        v[s].push_back(i);
        c[s][i]=1;
        cost[s][i]=0;
    }

    for(i=1; i<=n2; i++)
    {
        v[n+i].push_back(t);
        c[n+i][t]=1;
        cost[n+i][t]=0;
    }

    for(i=1; i<=m; i++)
    {
        f>>mx[i]>>my[i]>>cst;
        nod=mx[i];
        nod2=my[i]+n;
        v[nod].push_back(nod2);
        v[nod2].push_back(nod);
        c[nod][nod2]=1;
        cost[nod][nod2]=cst;
        cost[nod2][nod]=-cst;
    }

    Flux();
    return 0;
}