Cod sursa(job #1162505)

Utilizator lianaliana tucar liana Data 31 martie 2014 20:55:09
Problema Taramul Nicaieri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 105
#define inf 1000
int n, S, D, i, g1, g2, x, y, j, nrbf, inc, sf, ntd, el, fmin, nod, s1;
int co[2*nmax], viz[2*nmax], t[2*nmax], td[2*nmax], cap[2*nmax][2*nmax];
vector <int> ma[2*nmax];
vector <int> ::iterator it;

void citire()
{
    scanf("%ld",&n);
    S=0;    D=2*n+1;
    for (i=1;i<=n;i++)
    {
        scanf("%ld %ld",&g1,&g2);
        s1+=g1;
        x=i;    y=i+n;
        ma[S].push_back(x);     cap[S][x]=g1;
        ma[x].push_back(S);
        ma[y].push_back(D);     cap[y][D]=g2;
        ma[D].push_back(y);
    }
    for (i=1;i<=n;i++)
        for (j=n+1;j<=2*n;j++)
            if (i!=j-n)
            {
                ma[i].push_back(j); cap[i][j]=1;
                ma[j].push_back(i);
            }
}

void bfs()
{
    nrbf++; ntd=0;
    co[1]=S;    viz[S]=nrbf;
    inc=sf=1;
    while (inc<=sf)
    {
        el=co[inc]; inc++;
        for (it=ma[el].begin();it!=ma[el].end();it++)
            if (cap[el][*it]>0)
            {
                if (viz[*it]<nrbf)
                {
                    co[++sf]=*it;   viz[*it]=nrbf;
                    t[*it]=el;
                }
                if (*it==D)
                    td[++ntd]=el;
            }
    }
}

void rezolvare()
{
    while (1)
    {
        bfs();
        if (viz[D]==nrbf)
            for (i=1;i<=ntd;i++)
            {
                t[D]=td[i];
                fmin=inf;
                nod=D;
                while ((nod>S)&&(fmin>0))
                {
                    if (fmin>cap[t[nod]][nod])
                        fmin=cap[t[nod]][nod];
                    nod=t[nod];
                }
                nod=D;
                if (fmin>0)
                    while (nod>S)
                    {
                        cap[t[nod]][nod]-=fmin;
                        cap[nod][t[nod]]+=fmin;
                        nod=t[nod];
                    }
            }
        else
            break;
    }
}

void afisare()
{
    printf("%ld\n",s1);
    for (i=1;i<=n;i++)
        for (j=n+1;j<=2*n;j++)
            if ((cap[i][j]==0)&&(i!=j-n))
                printf("%ld %ld\n",i,j-n);
}

int main()
{
    freopen("harta.in","r",stdin);
    freopen("harta.out","w",stdout);
    citire();
    rezolvare();
    afisare();
    return 0;
}