Cod sursa(job #1293283)

Utilizator gapdanPopescu George gapdan Data 15 decembrie 2014 18:03:26
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<cstdio>
#include<vector>
#include<cstring>
#define NMAX 20004
using namespace std;
int n,m,i,x,y,ok,nr;
int viz[NMAX],e[NMAX],R[NMAX],L[NMAX];
vector<int>v[NMAX];
bool cupleaza(int nod)
{
    if (viz[nod]==1) return 0;
    viz[nod]=1;
    vector<int>::iterator it;
    for (it=v[nod].begin();it!=v[nod].end();++it)
    {
        if (R[*it]==0)
        {
            L[nod]=*it;
            R[*it]=nod;
            return 1;
        }
    }
    for (it=v[nod].begin();it!=v[nod].end();++it)
    {
        if (cupleaza(R[*it]))
        {
            L[nod]=*it;
            R[*it]=nod;
            return 1;
        }
    }
    return 0;
}
void Sup(int nod)
{
    vector<int>::iterator it;
    for (it=v[nod].begin();it!=v[nod].end();++it)
    {
        if (e[*it]==0)
        {
            e[*it]=1;
            e[R[*it]]=0;
            Sup(R[*it]);
        }
    }
}
int main()
{
    freopen("felinare.in","r",stdin);
    freopen("felinare.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1;i<=m;++i)
    {
        scanf("%d%d",&x,&y);
        v[n+x].push_back(y);
    }
    ok=0;
    do
    {
        memset(viz,0,sizeof(viz));
        ok=1;
        for (i=n+1;i<=2*n;++i)
            if (L[i]==0 && cupleaza(i)) ok=0;
    }while(ok==0);
    for (i=n+1;i<=2*n;++i)
        if (L[i]!=0) e[i]=1;
    for (i=1;i<=2*n;++i)
        if (L[i]==0) Sup(i);
    for (i=1;i<=2*n;++i)
        if (e[i]==0) ++nr;
    printf("%d\n",nr);
    for (i=1;i<=n;++i)
    {
        if(e[i]==0 && e[i+n]==0) printf("3\n");
        else if (e[i]==0 && e[i+n]==1) printf("2\n");
        else if (e[i]==1 && e[i+n]==0) printf("1\n");
        else printf("0\n");
    }
    return 0;
}