Cod sursa(job #2020177)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 9 septembrie 2017 15:39:37
Problema Felinare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include<bits/stdc++.h>
#define maxN 16500
using namespace std;
bool seen[maxN];
int l[maxN],r[maxN];
vector<int> v[maxN];
int n,m,x,y,augment;
inline int path(int nod)
{
    if(seen[nod]) return 0;
    seen[nod]=1;
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        if(!r[*it])
        {
            r[*it]=nod;
            l[nod]=*it;
            return 1;
        }
    }
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        if(path(r[*it]))
        {
            r[*it]=nod;
            l[nod]=*it;
            return 1;
        }
    }
    return 0;
}
int sr[maxN],sl[maxN];
inline void cover(int nod)
{
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        if(!sr[*it])
        {
            sr[*it]=1;
            sl[l[*it]]=0;
            cover(l[*it]);
        }
    }
}
int main()
{
    freopen("felinare.in","r",stdin);
    freopen("felinare.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
    }
    augment=1;
    while(augment)
    {
        augment=0;
        memset(seen,0,sizeof(seen));
        for(int i=1;i<=n;i++)
        {
            if(!l[i])
            {
                augment=augment|path(i);
            }
        }
    }

    int cuplaj=0;
    for(int i=1;i<=n;i++)
        if(l[i]) cuplaj++;
    printf("%d\n",2*n-cuplaj);

    for(int i=1;i<=n;i++)
        if(l[i]) sl[i]=1;
    for(int i=1;i<=n;i++)
        if(!sl[i]) cover(i);
    for(int i=1;i<=n;i++)
    {
        if(sl[i] && sr[i])
        {
            printf("0\n");
        }
            else
        if(sl[i] && !sr[i])
        {
            printf("2\n");
        }
            else
        if(!sl[i] && sr[i])
        {
            printf("1\n");
        }
            else printf("3\n");
    }
    return 0;
}