Cod sursa(job #2418992)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 7 mai 2019 12:24:03
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include<fstream>
#include<queue>
#define DIM 610
#define inf 1000000000
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
int n,m,k,e,i,a,b,c,mini,sol;
pair<int,int> cap[DIM][DIM];
vector<int> v[DIM];
queue<int> q;
int d[DIM],f[DIM],h[DIM][DIM],p[DIM][DIM],t[DIM];
int bellma()
{
    for(int i=0;i<=k;i++) d[i]=inf,f[i]=0;
    int nod;
    q.push(0);f[0]=1;d[0]=0;
    while(!q.empty())
    {
        nod=q.front();f[nod]=0;q.pop();
        for(auto vecin:v[nod])
            if(d[vecin]>d[nod]+p[nod][vecin]&&h[nod][vecin]<cap[nod][vecin].first)
            {
                d[vecin]=d[nod]+p[nod][vecin];
                t[vecin]=nod;
                if(!f[vecin]){q.push(vecin);f[vecin]=1;}
            }
    }
    if(d[k]==inf) return 0;
    else return 1;
}

int main()
{
    fin>>n>>m>>e;t[0]=-1;
    for(i=1;i<=e;i++)
    {
        fin>>a>>b>>c;b+=n;
        v[a].push_back(b);
        v[b].push_back(a);
        cap[a][b].first=1;
        cap[a][b].second=i;
        p[a][b]=c;p[b][a]=-c;
    }
    for(i=1;i<=n;i++)
    {
        v[0].push_back(i);
        v[i].push_back(0);
        cap[0][i].first=1;
    }
    k=n+m+1;
    for(i=n+1;i<=n+m;i++)
    {
        v[i].push_back(k);
        v[k].push_back(i);
        cap[i][k].first=1;
    }
    while(bellma()==1)
    {
        mini=inf;b=k;a=t[k];
        while(a!=-1)
        {
            mini=min(mini,cap[a][b].first-h[a][b]);
            b=a;a=t[a];
        }
        b=k;a=t[k];
        while(a!=-1)
        {
            h[a][b]+=mini;
            h[b][a]-=mini;
            sol+=mini*p[a][b];
            b=a;a=t[a];
        }
    }
    int nr=0,j;
    for(i=1;i<=n;i++)
        for(j=n+1;j<k;j++)
            if(h[i][j])
                nr++;
    fout<<nr<<" "<<sol<<"\n";
    for(i=1;i<=n;i++)
        for(j=n+1;j<k;j++)
            if(h[i][j]) fout<<cap[i][j].second<<" ";
    return 0;
}