Cod sursa(job #1582995)

Utilizator ZimmyZimmermann Erich Zimmy Data 28 ianuarie 2016 17:43:28
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <deque>
#include <vector>
#define N 602

using namespace std;
ifstream f("cmcm.in");
ofstream g("cmcm.out");
const int oo=1000000000;
int L,R,K,sol,s,d,a,b,e,cst,i,E[N][N],C[N][N],c[N][N],Cst[N],q[N],T[N],bellman();
void upd();
deque<int> Q;
vector<int> v[N],Sol;
int main()
{
    f>>L>>R>>e;
    for(i=1;i<=e;i++)
    {
        f>>a>>b>>cst;
        b+=L;
        C[a][b]=1;c[a][b]=cst;c[b][a]=-cst;
        E[a][b]=i;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    s=0;d=L+R+1;
    for(i=1;i<=L;i++)
    {
        C[s][i]=1;
        v[s].push_back(i);
    }
    for(i=L+1;i<d;i++)
    {
        C[i][d]=1;
        v[i].push_back(d);
    }
    for(;bellman();)
        upd();
    for(i=1;i<=L;i++)
        for(auto it:v[i])
            if(C[i][it]==0&&it!=s)
                Sol.push_back(E[i][it]);
    g<<Sol.size()<<' '<<K<<'\n';
    for(auto it:Sol)
        g<<it<<' ';
    return 0;
}
int bellman()
{
    for(i=1;i<=d;i++)
        Cst[i]=oo;
    Q.push_back(s);
    q[s]=1;
    while(Q.size())
    {
        a=Q.front();
        Q.pop_front();
        q[a]=0;
        cst=Cst[a];
        for(auto it:v[a])
            if(C[a][it])
                if(Cst[it]>cst+c[a][it])
                {
                   Cst[it]=cst+c[a][it];
                   T[it]=a;
                   if(!q[it])
                   {
                       Q.push_back(it);
                       q[it]=1;
                   }
                }
    }
    if(Cst[d]==oo)
        return 0;
    return 1;
}
void upd()
{
    for(a=d;a!=T[a];a=T[a])
    {
        C[T[a]][a]=0;
        C[a][T[a]]=1;
        K+=c[T[a]][a];
    }
}