Cod sursa(job #1130422)

Utilizator tester9x9Tester9x9 tester9x9 Data 28 februarie 2014 13:12:33
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <vector>
#define NM 10010

using namespace std;

ifstream f("felinare.in");
ofstream g("felinare.out");

int N, M;
vector<int> G[NM];
int L[NM], R[NM];
int VCL[NM], VCR[NM];
int Viz[NM];
int run;

bool Pair (int node)
{
    if (Viz[node]==run)
        return 0;

    Viz[node]=run;

    for (vector<int>::iterator it=G[node].begin(); it!=G[node].end(); ++it)
        if (R[*it]==0)
        {
            L[node]=*it;
            R[*it]=node;
            return 1;
        }

    for (vector<int>::iterator it=G[node].begin(); it!=G[node].end(); ++it)
        if (Pair(R[*it]))
        {
            L[node]=*it;
            R[*it]=node;
            return 1;
        }

    return 0;
}

void Cover (int node)
{
    for (vector<int>::iterator it=G[node].begin(); it!=G[node].end(); ++it)
        if (VCR[*it]==0)
        {
            VCR[*it]=1;
            VCL[R[*it]]=0;
            Cover(R[*it]);
        }
}

int main ()
{
    f >> N >> M;
    for (int i=1; i<=M; i++)
    {
        int a, b;
        f >> a >> b;
        G[a].push_back(b);
    }

    bool ok=1;
    for (run=1; ok==1; run++)
    {
        ok=0;
        for (int i=1; i<=N; i++)
            if (!L[i])
                ok|=Pair(i);
    }

    for (int i=1; i<=N; i++)
        if (L[i]!=0)
            VCL[i]=1;

    for (int i=1; i<=N; i++)
        if (VCL[i]==0)
            Cover(i);

    int ANS=0;
    for (int i=1; i<=N; i++)
        ANS+=2 - VCL[i] - VCR[i];

    g << ANS << '\n';

    for (int i=1; i<=N; i++)
    {
        int val=0;
        if (VCL[i]==0)
            val+=1;
        if (VCR[i]==0)
            val+=2;

        g << val << '\n';
    }

    f.close();
    g.close();

    return 0;
}