Cod sursa(job #881942)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 18 februarie 2013 19:33:17
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <cstdio>
#include <vector>
#include <cstring>

#define NMax 8500

using namespace std;

vector <int> G[NMax];
int N, L[NMax], R[NMax], C;
bool Used[NMax], UsedL[NMax], UsedR[NMax];

void Read ()
{
    freopen ("felinare.in", "r", stdin);
    int M;
    scanf ("%d %d", &N, &M);
    for (; M>0; --M)
    {
        int X, Y;
        scanf ("%d %d", &X, &Y);
        G[X].push_back (Y);
    }
}

inline bool PairUp (int X)
{
    if (Used[X])
    {
        return false;
    }
    Used[X]=true;
    for (vector <int> :: iterator Y=G[X].begin (); Y!=G[X].end (); ++Y)
    {
        if (L[*Y]==0 or PairUp (L[*Y]))
        {
            L[*Y]=X, R[X]=*Y, UsedL[X]=true;
            return true;
        }
    }
    return false;
}

void Cuplaj ()
{
    for (bool Change=true; Change; )
    {
        Change=false;
        memset (Used, 0, sizeof (Used));
        for (int i=1; i<=N; ++i)
        {
            if (R[i]==0)
            {
                Change|=PairUp (i);
            }
        }
    }
    for (int i=1; i<=N; ++i)
    {
        if (L[i]>0)
        {
            ++C;
        }
    }
}

inline bool SPairUp (int X)
{
    for (vector <int> :: iterator Y=G[X].begin (); Y!=G[X].end (); ++Y)
    {
        if (!UsedR[*Y])
        {
            UsedR[*Y]=true, UsedL[L[*Y]]=false;
            SPairUp (L[*Y]);
        }
    }
}

void Support ()
{
    for (int i=1; i<=N; ++i)
    {
        if (!UsedL[i])
        {
            SPairUp (i);
        }
    }
}

void Solve ()
{
    Cuplaj ();
    Support ();
}

void Print ()
{
    freopen ("felinare.out", "w", stdout);
    printf ("%d\n", 2*N-C);
    for (int i=1; i<=N; ++i)
    {
        printf ("%d\n", 1^UsedL[i]+2*(1^UsedR[i]));
    }
}

int main()
{
    Read ();
    Solve ();
    Print ();
    return 0;
}