Cod sursa(job #2098752)

Utilizator amaliarebAmalia Rebegea amaliareb Data 3 ianuarie 2018 14:43:32
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("joc4.in");
ofstream g("joc4.out");
const int MaxN = 253;
int n, m, from[2 * MaxN], s, d;
char flow[2 * MaxN][2 * MaxN], cap[2 * MaxN][2 * MaxN];
vector<int> gr[2 * MaxN];
queue<int> q;
bool viz[2 * MaxN];

bool bfs()
{
    memset(viz, 0, sizeof(viz));
    memset(from, 0, sizeof(from));
    while (!q.empty()) q.pop();
    q.push(s);
    viz[s] = 1;
    viz[s - 1] = 1;
    while (!q.empty() && !viz[d])
    {
        int node = q.front();
        for (auto son: gr[node])
        {
            if (!viz[son] && flow[node][son] < cap[node][son])
            {
                viz[son] = 1;
                from[son] = node;
                q.push(son);
            }
        }
        q.pop();
    }
    return viz[d];
}

int main()
{
    f >> n >> m >> s >> d;
    for (int i = 1; i <= n; ++i)
    {
        cap[2 * i][2 * i + 1] = 1;
        gr[2 * i].push_back(2 * i + 1);
        gr[2 * i + 1].push_back(2 * i);
    }
    for (int i = 1; i <= m; ++i)
    {
        int x, y;
        f >> x >> y;
        cap[2 * x + 1][2 * y] = 1;
        cap[2 * y + 1][2 * x] = 1;
        gr[2 * x + 1].push_back(2 * y);
        gr[2 * y].push_back(2 * x + 1);
        gr[2 * y + 1].push_back(2 * x);
        gr[2 * x].push_back(2 * y + 1);
    }
    s = 2 * s + 1;
    d = 2 * d;
    gr[d].clear();
    gr[s - 1].clear();
    int ans = 0;
    while (bfs())
    {
        for (int i = 1; i <= 2 * n + 1; ++i)
            if (i != d && (from[i] || i == s) && flow[i][d] < cap[i][d])
            {
                int mini = 100000;
                from[s] = 0;
                from[d] = i;
                int node = d;
                while (from[node])
                {
                    mini = min(mini, cap[from[node]][node] - flow[from[node]][node]);
                    node = from[node];
                }
                node = d;
                while (from[node])
                {
                    flow[from[node]][node] += mini;
                    flow[node][from[node]] -= mini;
                    node = from[node];
                }
                ans += mini;
            }
    }
    g << ans << '\n';
    return 0;
}