Cod sursa(job #972774)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 12 iulie 2013 17:09:35
Problema Taramul Nicaieri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>

#define newn a[x][i]

using namespace std;

ifstream fin("harta.in");
ofstream fout("harta.out");

const int N = 105*2;

int n, s, m, d, t[N], c[N][N], f[N][N];
vector <int> a[N];
vector <bool> viz(N);
queue <int> q;

bool bfs()
{
    for(int i=1; i<=d; i++) viz[i] = 0;
    q.push(0); viz[0] = 1;
    while(!q.empty())
    {
        int x = q.front(); q.pop();
        for(unsigned i=0; i<a[x].size(); i++)
            if(!viz[newn] && f[x][newn] < c[x][newn])
            {
                t[newn] = x;
                viz[newn] = 1;
                q.push(newn);
            }
    }
    return viz[d];
}

int main()
{
    fin>>n; d = 2*n+1;
    for(int i=1; i<=n; i++)
    {
        int x, y;
        fin>>x>>y;
        m += x;
        a[s].push_back(i);
        a[i].push_back(s);
        a[i+n].push_back(d);
        a[d].push_back(i+n);
        c[s][i] = x;
        c[i+n][d] = y;
    }
    for(int i=1; i<=n; i++)
        for(int j=n+1; j<d; j++)
            if(i != j-n)
            {
                a[i].push_back(j);
                a[j].push_back(i);
                c[i][j] = 1;
            }

    while(bfs())
    {
        for(int i=1; i<d; i++)
            if(f[i][d] < c[i][d])
            {
                int fmin = c[i][d] - f[i][d];
                for(int j=i; j!=s; j=t[j])
                    fmin = min(fmin, c[t[j]][j] - f[t[j]][j]);
                for(int j=i; j!=s; j=t[j])
                {
                    f[t[j]][j] += fmin;
                    f[j][t[j]] -= fmin;
                }
                f[i][d] += fmin;
                f[d][i] -= fmin;
            }
    }

    fout<<m<<' '<<'\n';
    for(int i=1; i<=n; i++)
        for(int j=n+1; j<d; j++)
            if(f[i][j])
                fout<<i<<' '<<j-n<<'\n';
    return 0;
}