Cod sursa(job #1345471)

Utilizator acomAndrei Comaneci acom Data 17 februarie 2015 17:22:42
Problema Felinare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;
#define NMAX 8195
ifstream fin("felinare.in");
ofstream fout("felinare.out");
vector <int> v[NMAX];
bitset <NMAX> viz;
int n,m,x,y,nr,D[2][NMAX],L[NMAX],R[NMAX],N[NMAX];
bool cupleaza(int nod)
{
    int i;
    if (viz[nod]) return false;
    viz[nod]=1;
    for (i=0;i<v[nod].size();++i)
        if (!R[v[nod][i]])
        {
            L[nod]=v[nod][i];
            R[v[nod][i]]=nod;
            return true;
        }
    for (i=0;i<v[nod].size();++i)
        if (cupleaza(R[v[nod][i]]))
        {
            L[nod]=v[nod][i];
            R[v[nod][i]]=nod;
            return true;
        }
    return false;
}
int main()
{
    int i;
    bool ok;
    fin>>n>>m;
    for (i=1;i<=m;++i)
    {
        fin>>x>>y;
        ++D[0][x], ++D[1][y];
        v[x].push_back(y);
    }
    for (ok=true;ok;)
    {
        ok=false;
        viz.reset();
        for (i=1;i<=n;++i)
            if (!L[i] && cupleaza(i))
                ok=true;
    }
    for (i=1;i<=n;++i)
        N[i]=3;
    for (i=1;i<=n;++i)
        if (L[i])
        {
            ++nr;
            if (D[0][i]>D[1][L[i]])
                --N[i];
            else
                N[L[i]]-=2;
        }
    fout<<2*n-nr<<"\n";
    for (i=1;i<=n;++i)
        fout<<N[i]<<"\n";
    return 0;
}