Cod sursa(job #1579396)

Utilizator SmarandaMaria Pandele Smaranda Data 24 ianuarie 2016 18:23:10
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

const int N = 270;
vector <int> graph [N];
vector <pair <int, int> > l;
int n, a [N], b [N], st [N], dr [N], right;
bool used [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 (!b [*it]) {
            a [x] = *it;
            b [*it] = x;
            return 1;
        }
    for (it = graph [x].begin (); it != graph [x].end (); ++ it)
        if (b [*it] && b [*it] != x) {
            flag = cuplaj (b [*it]);
            if (flag == 1) {
                b [*it] = x;
                a [x] = *it;
                return 1;
            }
        }
    return 0;
}

void dfs (int x, int af) {

    if (af == 1)
        printf ("%d ", x);
    if (used [x] == 1 && af == 0) {
        right = dr [x];
        st [x] = dr [x] = 0;
        return;
    }
    used [x] = 1;
    right = x;
    if (a [x])
        dfs (a [x], af);
}

int main () {
    int i, m, x, y, ans = 0, last;
    vector <pair <int, int> > :: iterator it;
    bool flag;

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

    scanf ("%d%d", &n, &m);

    for (i = 1; i <= m; i ++) {
        scanf ("%d%d", &x, &y);
        graph [x].push_back (y);
    }

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

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

    memset (used, 0, sizeof (used));
    for (i = 1; i <= n; i ++) {
        st [i] = i;
        dfs (i, 0);
        dr [i] = right;
    }
    last = 0;
    for (i = 1; i <= n; i ++)
        if (st [i]) {
            if (last)
                printf ("%d %d\n", last, st [i]);
            last = dr [i];
        }
    for (i = 1; i <= n; i ++)
        if (st [i]) {
            dfs (i, 1);
        }
    printf ("\n");
    return 0;
}