Cod sursa(job #1414284)

Utilizator heracleRadu Muntean heracle Data 2 aprilie 2015 14:53:47
Problema Cuplaj maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.58 kb
#include <cstdio>
#include <queue>
#include <cstring>

FILE* in=fopen("cmcm.in","r");
FILE* out=fopen("cmcm.out","w");

const int Q=700,W=50007,INF=2000000000;

int v[Q][Q],f[Q][Q],init[Q][Q];

int X,Y,m;

int lst[Q],val[2*W],nxt[2*W],cost[2*W],nr;

int dad[Q];

void fill()
{
    int act=X+Y+1;

    while(act)
    {
        f[dad[act]][act]=1;
        f[act][dad[act]]=-1;

        act=dad[act];
    }
}

int ap[Q];

struct tipe
{
    int nod,val;
};

std::queue<tipe> q;

int dist[Q];

void belman()
{
    memset(ap,0,sizeof ap);
    memset(dad,0,sizeof dad);
    while(!q.empty())
        q.pop();

    q.push(tipe{0,0});

    ap[0]=1;

    for(int i=1; i<=X+Y+1; i++)
        dist[i]=INF;

    tipe act;

    while(!q.empty())
    {
        act=q.front();
        q.pop();
        if(act.val!=dist[act.nod])
            continue;

        for(int p=lst[act.nod]; p; p=nxt[p])
        {
            if(v[act.nod][val[p]]-f[act.nod][val[p]]>0  && dist[val[p]] > act.val+cost[p])
            {
                dist[val[p]]=act.val+cost[p];
                ap[val[p]]++;
                if(ap[val[p]]==X+Y+1)
                    return;

                dad[val[p]]=act.nod;


              //  if(val[p]==X+Y+1)
              //      return;

                q.push(tipe{val[p],dist[val[p]]});
            }
        }
    }
}


void add(int a, int b, int c)
{
    nr++;
    val[nr]=b;
    cost[nr]=c;
    nxt[nr]=lst[a];
    lst[a]=nr;
}


int main()
{
    fscanf(in,"%d%d%d",&X,&Y,&m);

    int a,b,c;

    for(int i=1; i<=m; i++)
    {
        fscanf(in,"%d%d%d",&a,&b,&c);

        b+=X;

        v[a][b]=1;
        init[a][b]=i;

        add(a,b,c);
        add(b,a,c);
    }

    for(int i=1; i<=X; i++)
    {
        v[0][i]=1;

        add(0,i,0);
    }

    for(int i=X+1; i<=X+Y; i++)
    {
        v[i][X+Y+1]=1;
        add(i,X+Y+1,0);
    }

    while(true)
    {
        belman();

        if(dad[X+Y+1]==0)
            break;

        fill();
    }

    int nr=0,cc=0;

    for(int i=X+1; i<=X+Y; i++)
    {
        for(int j=1; j<=X; j++)
        {
            if(f[j][i]==1)
            {
                nr++;
                for(int p=lst[j]; p; p=nxt[p])
                {
                    if(val[p]==i)
                    {
                        cc+=cost[p];
                        break;
                    }
                }
            }
        }
    }

    fprintf(out,"%d %d\n",nr,cc);

    for(int i=X+1; i<=X+Y; i++)
    {
        for(int j=1; j<=X; j++)
        {
            if(f[j][i]==1)
            {
                fprintf(out,"%d ",init[j][i]);
            }
        }
    }

    return 0;
}