Cod sursa(job #2400005)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 8 aprilie 2019 11:23:34
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("cmcm.in");
ofstream out("cmcm.out");
int pr[602],c[602][602],a[602][602],d[2][602],cst[602],ind[602][602],D;
vector<int> v[602];
queue<int> q;
priority_queue<pair<int,int>> h;
bool dij(int k)
{
    int nr1,nr2;
    memset(pr,0,sizeof(pr));
    memset(cst,0,sizeof(cst));
    h.push({-1,0});
    cst[0]=1;
    d[1-k][0]=0;
    while(!h.empty())
    {
        nr1=h.top().first;nr2=h.top().second;
        cst[nr2]=-nr1;
        for(auto it:v[nr2])
            if(c[nr2][it]&&(cst[nr2]+a[nr2][it]+d[k][nr2]-d[k][it]<-cst[it]||!cst[it]))
            {
                cst[it]=-(cst[nr2]+a[nr2][it]+d[k][nr2]-d[k][it]);
                d[1-k][it]=d[1-k][nr2]+a[nr2][it];
                pr[it]=nr2;
                h.push({cst[it],it});
            }
        while(!h.empty()&&h.top().first!=cst[h.top().second])
            h.pop();
    }
    return cst[D];
}
int main()
{
    int n1,n2,m,nr1,nr2,nr,i,j;
    in>>n1>>n2>>m;
    D=(n2+=n1)+1;
    for(i=1;i<=m;i++)
    {
        in>>nr1>>nr2;
        ind[nr1][nr2]=i;
        nr2+=n1;
        v[nr1].push_back(nr2);
        v[nr2].push_back(nr1);
        in>>a[nr1][nr2];
        a[nr2][nr1]=-a[nr1][nr2];
        c[nr1][nr2]=1;
    }
    for(i=1;i<=n1;i++)
    {
        v[0].push_back(i);
        c[0][i]=1;
    }
    for(;i<=n2;i++)
    {
        v[i].push_back(D);
        c[i][D]=1;
    }
    q.push(0);
    for(i=1;i<=D;i++)
        d[1][i]=1<<29;
    while(!q.empty())
    {
        nr=q.front();
        q.pop();
        for(auto it:v[nr])
        {
            if(c[nr][it]&&d[1][nr]+a[nr][it]<d[1][it])
            {
                d[1][it]=d[1][nr]+a[nr][it];
                if(!pr[it])
                    pr[it]=1,q.push(it);
            }
        }
        pr[nr]=0;
    }
    nr=nr2=m=0;
    while(dij(nr2=1-nr2))
    {
        for(nr1=1<<29,i=D;i;i=pr[i])
            nr1=min(nr1,c[pr[i]][i]);
        m+=nr1*d[1-nr2][D];
        nr+=nr1;
        for(i=D;i;i=pr[i])
            c[pr[i]][i]-=nr1,c[i][pr[i]]+=nr1;
    }
    out<<nr<<" "<<m<<"\n";
    for(i=1;i<=n1;i++)
        for(j=n1+1;j<=n2;j++)
            if(c[j][i]==1)
                out<<ind[i][j-n1]<<" ";
    return 0;
}