Cod sursa(job #2067204)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 16 noiembrie 2017 00:07:15
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream in ("felinare.in");
ofstream out ("felinare.out");
const int dim = 8200;
int dreapta[dim],stanga[dim],rez,sr[dim],sl[dim],n,m,a,b,sol;
bool marked[dim],ok;
vector<int>v[dim];
bool cuplaj (int knot) {
    int vecin;
    if (marked[knot]) {
        return 0;
    }
    marked[knot] = 1;
    for (int i = 0; i < v[knot].size(); i ++) {
        vecin = v[knot][i];
        if (dreapta[vecin] == 0) {
            dreapta[vecin] = knot;
            stanga[knot] = vecin;
            return 1;
        }
    }
    for (int i = 0; i < v[knot].size(); i ++) {
        vecin = v[knot][i];
        if (cuplaj(dreapta[vecin]) == 1) {
            dreapta[vecin] = knot;
            stanga[knot] = vecin;
            return 1;
        }
    }
    return 0;
}
void suport (int knot) {
    int vecin;
    for (int i = 0; i < v[knot].size(); i ++) {
        vecin = v[knot][i];
        if (sr[vecin] == 0) {
            sr[vecin] = 1;
            sl[dreapta[vecin]] = 0;
            suport (dreapta[vecin]);
        }
    }
    return;
}
int main (void) {
    in >> n >> m;
    for (int i = 1; i <= m; i ++) {
        in >> a >> b;
        v[a].push_back (b);
    }
    ok = 1;
    while (ok) {
        for (int i = 1; i <= n; i ++) {
            marked[i] = 0;
        }
        ok = 0;
        for (int i = 1; i <= n; i ++) {
            if (stanga[i] == 0 && cuplaj(i) == 1) {
                ok = 1;
            }
        }
    }
    for (int i = 1; i <= n; i ++) {
        if (stanga[i] != 0) {
            sl[i] = 1;
        }
    }
    for (int i = 1; i <= n; i ++) {
        if (sl[i] == 0) {
            suport (i);
        }
    }
    for (int i = 1; i <= n; i ++) {
        if (sl[i] == 0) {
            sol++;
        }
        if (sr[i] == 0) {
            sol++;
        }
    }
    out << sol <<"\n";
    for (int i = 1; i <= n; i ++) {
        rez = 3;
        if (sl[i] == 1) {
            rez --;
        }
        if (sr[i] == 1) {
            rez -= 2;
        }
        out << rez <<"\n";
    }
    return 0;
}