Cod sursa(job #1147382)

Utilizator cat_red20Vasile Ioana cat_red20 Data 19 martie 2014 19:45:03
Problema Felinare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<fstream>
#include<vector>
#include<cstring>
#define MAXN 8192
using namespace std;
int n,m,viz[MAXN],l[MAXN],r[MAXN],sl[MAXN],sr[MAXN],ok,sol;
vector<int>g[MAXN];
ifstream fin("felinare.in");
ofstream fout("felinare.out");
void citire()
{
    int x,y;
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        g[x].push_back(y);
    }
}

int cupleaza(int nod)
{
    if(viz[nod]==1)
        return 0;
    viz[nod]=1;
    for(vector<int>::iterator it=g[nod].begin();it!=g[nod].end();it++)
    {
       if(r[*it]==0)
       {
           r[*it]=nod;
           l[nod]=*it;
           sl[nod]=1;
           return 1;
       }
    }
    for(vector<int>::iterator it=g[nod].begin();it!=g[nod].end();it++)
    {
        if(cupleaza(r[*it]))
        {
            r[*it]=nod;
            l[nod]=*it;
            sl[nod]=1;
            return 1;
        }
    }
    return 0;
}

void support(int nod)
{
    for(vector<int>:: iterator it=g[nod].begin();it!=g[nod].end();++it)
    {
        if(sr[*it]==0)
        {
            sr[*it]=1;
            sl[l[*it]]=0;
            support(l[*it]);
        }
    }
}

int main()
{
    citire();
    do
    {
        ok=0;
        memset(viz,0,sizeof(viz));
        for(int i=1;i<=n;i++)
        {
            if(l[i]==0 && cupleaza(i))
            {
                ok=1;
                sol++;
            }
        }
    }while(ok);

    for(int i=1;i<=n;i++)
    {
        if(sl[i]==0)
        support(i);
    }

    fout<<2*n-sol<<"\n";
    for(int i=1;i<=n;i++)
    {
        fout<<3-sl[i]-2*sr[i]<<"\n";
    }
    return 0;
}