Cod sursa(job #1576747)

Utilizator SmarandaMaria Pandele Smaranda Data 22 ianuarie 2016 19:59:03
Problema Strazi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

const int N = 270;
vector <int> graph [2 * N];
vector <pair <int, int> > l;

int n, dr, X [2 * N], Y [2 * N];
bool used [2 * N];

bool cuplaj (int x) {
    bool flag;
    vector <int> :: iterator it;

    if (used [x] == 1)
        return 0;

    used [x] = 1;
    for (it = graph [x].begin (); it != graph [x].end (); ++ it)
        if (!Y [*it]) {
            X [x] = *it;
            Y [*it] = x;
            return 1;
        }
    for (it = graph [x].begin (); it != graph [x].end (); ++ it)
        if (Y [*it] && Y [*it] != x) {
            flag = cuplaj (Y [*it]);
            if (flag == 1) {
                Y [*it] = x;
                X [x] = *it;
                return 1;
            }
        }
    return 0;
}

void dfs (int x, bool af) {
    int urm;

    used [x] = 1;
    if (af == 1)
        printf ("%d ", (x + 1) / 2);
    dr = x;
    urm = X [x];
    if (urm == 0)
        return;
    urm ++;
    dfs (urm, af);
}

int main () {
    int i, m, a, b, A1, A2, B1, B2, lim, ans = 0, st;
    vector <pair <int, int> > :: iterator it;
    bool flag;

    freopen ("strazi.in", "r", stdin);
    freopen ("strazi.out", "w", stdout);

    scanf ("%d%d", &n, &m);
    lim = 2 * n;

    for (i = 1; i <= m; i ++) {
        scanf ("%d%d", &a, &b);
        A1 = 2 * a - 1;
        A2 = 2 * a;
        B1 = 2 * b - 1;
        B2 = 2 * b;
        graph [A2].push_back (B1);
    }

    flag = true;
    while (flag) {
        flag = 0;
        memset (used, 0, sizeof (used));
        for (i = 2; i <= lim; i = i + 2)
            if (X [i] == 0) {
                if (cuplaj (i) == 1) {
                    ans ++;
                    flag = 1;
                }
            }
    }

    printf ("%d\n", n - 1 - ans);

    memset (used, 0, sizeof (used));

    for (i = 2; i <= lim; i = i + 2)
        if (X [i]) {
            st = i;
            dfs (i, 0);
            l.push_back (make_pair (st, dr));
        }
        else
            if (!used [i])
                l.push_back (make_pair (i, i));

    for (it = l.begin (); (it + 1)!= l.end (); ++ it)
        printf ("%d %d\n", ((*it).second + 1) / 2, ((*(it + 1)).first + 1) / 2);
    memset (used, 0, sizeof (used));
    for (it = l.begin (); it != l.end (); ++ it)
        dfs ((*it).first, 1);
    return 0;
}