Cod sursa(job #2618797)

Utilizator StanCatalinStanCatalin StanCatalin Data 26 mai 2020 12:20:52
Problema Taramul Nicaieri Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <iostream>
#include <vector>
#include <cstring>
#include <fstream>
#include <queue>

using namespace std;

const int dim = 105;

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

vector <int> vec[3*dim];

int t[3*dim],viz[dim],c[dim][dim],n,m,a[dim],b[dim];

int BFS(int sursa,int destinatie)
{
    memset(viz,0,sizeof(viz));
    queue<int> q;
    q.push(sursa);
    viz[sursa] = 1;
    while (!q.empty())
    {
        int x = q.front();
      ///  cout << x << " ";
        q.pop();
        if (x == destinatie) continue;
        for (int j=0; j<vec[x].size(); j++)
        {
            int y = vec[x][j];
            if (!viz[y] && c[x][y] > 0)
            {
                viz[y] = 1;
                t[y] = x;
                q.push(y);
            }
        }
    }
    ///cout << endl;
    return viz[destinatie];
}

int Get_Flux(int sursa,int destinatie)
{
    int maxflow = 0;
    int fmin = 1e9;
    ///cout << BFS(sursa, destinatie, vec,c) << "\n";
   /// int ok =
    int ok = BFS(sursa, destinatie);
    while (ok)
    {
        for (int j=0; j<vec[destinatie].size(); j++)
        {
            int y = vec[destinatie][j];
            //cout << y << " ";

            t[destinatie] = y;
            fmin = 1e9;
            for (int i=destinatie; i != sursa ; i=t[i])
            {
                fmin = min(fmin, c[t[i]][i]);
            }
         ///   cout << fmin << " ";
            for (int i=destinatie; i != sursa ; i=t[i])
            {
                c[t[i]][i] -= fmin;
                c[i][t[i]] += fmin;
            }
           /// cout << maxflow < " ";
            maxflow += fmin;
        }
        ok = BFS(sursa, destinatie);
        ///ok = 0;
    }
    return maxflow;
}

int main()
{
    in >> n;
    for(int i=1; i<=n; i++)
    {
        in >> a[i] >> b[i];
    }
    int sursa = 0;
    int destinatie = 2*n+1;
    for (int i=1; i<=n; i++)
    {
        vec[i].push_back(sursa);
        vec[sursa].push_back(i);
        c[sursa][i] = a[i];
    }
    for (int i=1; i<=n; i++)
    {
        vec[n+i].push_back(destinatie);
        vec[destinatie].push_back(n+i);
        c[n+i][destinatie] = b[i];
    }
    for (int i=1; i<=n; i++)
    {
        for (int j=1; j<=n; j++)
        {
            if (i != j)
            {
                vec[i].push_back(n+j);
                vec[n+j].push_back(i);
                c[i][n+j] = 1;
            }
        }
    }
    out << Get_Flux(sursa, destinatie) << "\n";
    for (int i=1; i<=n; i++)
    {
        for (int j=1; j<=n; j++)
        {
            if (i != j && c[n+j][i] > 0)
            {
                out << i << " " << j << "\n";
            }
        }
    }
    return 0;
}