Cod sursa(job #1165986)

Utilizator RadEmanuelRad Emanuel RadEmanuel Data 3 aprilie 2014 09:04:11
Problema Cuplaj maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include<fstream>
#include<vector>
#include<list>
#include<utility>
#define dmax 6020
#define inf 2147000000
using namespace std;

ifstream fin ("cmcm.in");
ofstream fout("cmcm.out");
list<int> lista;
list<int>::iterator it;
vector< list<int> >l(dmax,lista);
int n,m,nrm,x,y,c,maxcuplaj,maxflow,i,j,s,d;
int dst[dmax],viz[dmax],que[5*dmax],dad[dmax];
int cap[dmax][dmax],flx[dmax][dmax],cost[dmax][dmax],muchii[dmax][dmax];

int bf()
{
    int ls=0,ld=0;
    for(i=1;i<=n+m+2;++i)
    {
        viz[i]=0;
        dad[i]=-1;
        dst[i]=inf;
    }
    viz[s]=1;
    dst[s]=0;
    que[0]=s;
    while(ls<=ld)
    {
        x=que[ls++];
        for(it=l[x].begin();it!=l[x].end();++it)
        {
            y=*it;
            c=cost[x][y];
            if(dst[y]>dst[x]+c && cap[x][y]>flx[x][y])
            {
                dst[y]=dst[x]+c;
                dad[y]=x;
                if(!viz[y])
                {
                    viz[y]=1;
                    que[++ld]=y;
                }
            }
        }
        viz[x]=0;
    }
    if(dst[d]>=inf)
        return 0;
    int flux=inf;
    for(i=d;i>0;i=dad[i])
        flux=min(flux,cap[dad[i]][i]-flx[dad[i]][i]);
    for(i=d;i>0;i=dad[i])
    {
        flx[dad[i]][i]+=flux;
        flx[i][dad[i]]-=flux;
    }
    return flux*dst[d];
}

int main()
{
    fin>>n>>m>>nrm;
    int k;
    for(k=1;k<=nrm;++k)
    {
        fin>>x>>y>>c;
        ++x;
        y+=n+1;
        l[x].push_back(y);
        l[y].push_back(x);
        muchii[x][y]=k;
        cost[x][y]=c;
        cost[y][x]=-c;
        cap[x][y]=1;
    }
    s=1;
    d=n+m+2;
    for(i=2;i<=n+1;++i)
    {
        l[s].push_back(i);
        l[i].push_back(s);
        cap[s][i]=1;
    }
    for(i=n+2;i<=n+m+1;++i)
    {
        l[i].push_back(d);
        l[d].push_back(i);
        cap[i][d]=1;
    }
    int ok=1;
    while(ok)
    {
        ok=bf();
        maxflow+=ok;
    }
    for(i=2;i<=n+1;++i)
        for(j=n+2;j<=n+m+1;++j)
            if(flx[i][j] && cap[x][y])
                ++maxcuplaj;
    fout<<maxcuplaj<<" "<<maxflow<<'\n';
    for(i=2;i<=n+1;++i)
        for(j=n+2;j<=n+m+1;++j)
            if(flx[i][j] && cap[x][y])
             fout<<muchii[i][j]<<" ";
    return 0;
}