Cod sursa(job #2458769)

Utilizator TudorCaloianCaloian Tudor-Ioan TudorCaloian Data 21 septembrie 2019 14:20:52
Problema Felinare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("felinare.in");
ofstream fout("felinare.out");

int n, m, l[100005], r[100005], ans;
bool check[100005], sr[100005], sl[100005];
vector <int> v[100005];

void support(int nod)
{

    for(int i = 0; i < v[nod].size(); i++)
    {
        int child = v[nod][i];

        if(!sr[child])
        {
            sr[child] = 1;
            sl[r[child]] = 0;
            support(r[child]);
        }
    }
}
bool cuplaj(int nod)
{
    if(check[nod]) return false;

    check[nod] = true;

    for(int i = 0; i < v[nod].size(); i++)
    {
        int child = v[nod][i];
        if(!r[child])
        {
            r[child] = nod;
            l[nod] = child;
            return true;
        }
    }

    for(int i = 0; i <  v[nod].size(); i++)
    {
        int child = v[nod][i];
        if(cuplaj(r[child]))
        {
            r[child] = nod;
            l[nod] = child;
            return true;
        }
    }

    return false;
}

int main()
{

    fin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        int a, b;
        fin >> a >> b;

        v[a].push_back(b);
    }

    bool ok = true;
    while(ok)
    {
        ok = 0;
        memset(check, 0, sizeof(check));
        for(int i = 1; i <= n; i++)
            if(!l[i])
                ok |= cuplaj(i);
    }
    for(int i = 1; i <= n; i ++)
        if(l[i])
            ans++;
    fout << 2*n-ans << '\n';
    for(int i = 1; i <= n; i++)
    {
        if(l[i])
            sl[i] = 1;
    }
    for(int i = 1; i <= n; i++)
        if(!l[i])
            support(i);
    for(int i = 1; i <= n; i ++)
    {
        if(sl[i] && sr[i])
            fout << 0 << '\n';
        else
            if(sl[i]) fout << 2 << '\n';
            else
                if(sr[i]) fout << 1 << '\n';
            else
                fout << 3 << '\n';
    }
    return 0;
}