Cod sursa(job #305095)

Utilizator Mishu91Andrei Misarca Mishu91 Data 16 aprilie 2009 11:09:18
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstdio>
#include <vector>
#include <bitset>

using namespace std;

#define MAX_N 9000
#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)

int N, M;
int C[MAX_N], R[MAX_N], S[MAX_N], D[MAX_N];
vector <int> G[MAX_N];
bitset <MAX_N> viz;

void citire()
{
    scanf("%d %d",&N, &M);

    while(M--)
    {
        int a, b;
        scanf("%d %d",&a, &b);
        G[a].push_back(b);
    }
}

int pairup(int nod)
{
    if(viz[nod]) return 0;
    viz[nod] = 1;

    foreach(G[nod])
        if(!R[*it])
        {
            C[nod] = *it;
            R[*it] = nod;
            S[nod] = 1;
            return 1;
        }

    foreach(G[nod])
        if(pairup(R[*it]))
        {
            C[nod] = *it;
            R[*it] = nod;
            S[nod] = 1;
            return 1;
        }
    return 0;
}

void cuplaj()
{
    int ok = 1;

    while(ok)
    {
        ok = 0;
        viz.reset();
        
        for(int i = 1; i <= N; ++i)
            if(C[i] == 0)
            ok |= pairup(i);
    }

    int cnt = 0;
    for(int i = 1; i <= N; ++i)
        cnt += S[i];

    printf("%d\n",2*N - cnt);
}

void suport(int nod)
{
    foreach(G[nod])
    {
        if(!D[*it])
        {
            D[*it] = 1;
            S[R[*it]] = 0;
            suport(R[*it]);
        }
    }
}

void suport_min()
{
    for(int i = 1; i <= N; ++i)
        if(!S[i]) suport(i);

    for(int i = 1; i <= N; ++i)
        printf("%d\n",(1 - S[i]) + 2 * (1 - D[i]));
}

int main()
{
    freopen("felinare.in","rt",stdin);
    freopen("felinare.out","wt",stdout);

    citire();
    cuplaj();
    suport_min();
}