Cod sursa(job #397606)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 17 februarie 2010 11:04:48
Problema Strazi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

#define MAXN 20005

int N, M;
vector<int> con[MAXN];
int l[MAXN], r[MAXN]; char used[MAXN];

inline int pair_up(int nod) {
    if (used[nod]) {
        return 0;
    }
    used[nod] = 1;
    vector<int> :: iterator it;
    for (it = con[nod].begin(); it != con[nod].end(); it++) {
        if (r[*it] == 0) {
            l[nod] = *it;
            r[*it] = nod;
            return 1;
        }
    }

    for (it = con[nod].begin(); it != con[nod].end(); it++) {
        if (pair_up(r[*it])) {
            l[nod] = *it;
            r[*it] = nod;
            return 1;
        }
    }
    return 0;
}

int main() {
    freopen("strazi.in", "rt", stdin);
#ifndef DEBUG
    freopen("strazi.out", "wt", stdout);
#endif

    scanf("%d %d", &N, &M);
    for (int i = 0; i < M; i++) {
        int x, y;
        scanf("%d %d", &x, &y);
        con[x].push_back(y);
    }

    for (bool done = false; !done; ) {
        memset(used, 0, sizeof(used));
        done = true;
        for (int i = 1; i <= N; i++) {
            if (l[i] == 0) {
                if (pair_up(i)) {
                    done = false;
                }
            }
        }
    }
    int REZ = N;
    for (int i = 1; i <= N; i++) {
        REZ -= (l[i] != 0);
    }
    printf("%d\n", REZ - 1);

    return 0;
}