Cod sursa(job #953777)

Utilizator misinoonisim necula misino Data 27 mai 2013 12:12:49
Problema Taramul Nicaieri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<fstream>
#define INF 999999999
using namespace std;
ifstream f("harta.in");
ofstream g("harta.out");
int p,u,sol,fluxm,d,cur,i,j,n,x,y,fl[205][205],q[205],t[205],viz[205],c[205][205];
void bfs()
{
    viz[1]=cur;
    p=u=1;
    q[1]=1;
    while(p<=u)
    {
        x=q[p];
        ++p;
        for(i=1;i<=d;++i)
        if(c[x][i]>fl[x][i]&&viz[i]!=cur)
        {
            viz[i]=cur;
            t[i]=x;
            if(i==d)
            return ;
            ++u;
            q[u]=i;
        }
    }
}
int main ()
{
    f>>n;
    for(i=1;i<=n;++i)
    {
        f>>x>>y;
        sol+=x;
        c[1][i+1]=x;
        c[i+n+1][2*n+2]=y;
    }
    d=2*n+2;
    for(i=2;i<=n+1;++i)
    for(j=n+2;j<d;++j)
    if(i!=j-n)
    c[i][j]=1;
    cur=1;

    while(viz[d]!=cur)
    {
        fluxm=INF;
        bfs();
        if(viz[d]!=cur)
        break;
        x=d;
        while(x!=1)
        {
            fluxm=min(fluxm,c[t[x]][x]-fl[t[x]][x]);
            x=t[x];
        }
        x=d;
        while(x!=1)
        {
            fl[t[x]][x]+=fluxm;
            fl[x][t[x]]-=fluxm;
            x=t[x];
        }
        ++cur;
    }
    g<<sol<<'\n';
    for(i=2;i<=n+1;++i)
    for(j=n+2;j<d;++j)
    if(fl[i][j])
    g<<i-1<<' '<<j-n-1<<'\n';
}