Cod sursa(job #2923997)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 22 septembrie 2022 18:50:13
Problema Felinare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

const int maxN = 8200;
int n, m;
int l[maxN], r[maxN], cuplaj;
bool used[maxN], in[2 * maxN];
vector <int> G[maxN];

bool pairup(int nod)
{
    if(used[nod])
        return 0;
    used[nod] = 1;
    for(int vecin : G[nod])
    {
        if(!r[vecin])
        {
            l[nod] = vecin;
            r[vecin] = nod;
            return 1;
        }
    }
    for(int vecin : G[nod])
    {
        if(pairup(r[vecin]))
        {
            l[nod] = vecin;
            r[vecin] = nod;
            return 1;
        }
    }
    return 0;
}

void dfs(int nod)
{
    for(int vecin : G[nod])
    {
        if(!in[vecin + n])
        {
            in[r[vecin]] = 0;
            in[vecin + n] = 1;
            dfs(r[vecin]);
        }
    }
}

int main()
{
    fin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        int x, y;
        fin >> x >> y;
        G[x].push_back(y);
    }
    bool changed = 1;
    while(changed)
    {
        changed = 0;
        memset(used, 0, sizeof used);
        for(int i = 1; i <= n; i++)
            if(!l[i])
                changed |= pairup(i);
    }
    for(int i = 1; i <= n; i++)
    {
        if(l[i])
        {
            cuplaj++;
            in[i] = 1;
        }
    }
    fout << 2 * n - cuplaj;
    fout << '\n';
    for(int i = 1; i <= n; i++)
        if(!l[i])
            dfs(i);
    for(int i = 1; i <= n; i++)
    {
        if(in[i] && in[n + i])
            fout << "0\n";
        if(!in[i] && in[n + i])
            fout << "1\n";
        if(in[i] && !in[n + i])
            fout << "2\n";
        if(!in[i] && !in[n + i])
            fout << "3\n";
    }
    return 0;
}