Cod sursa(job #2142452)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 25 februarie 2018 00:27:51
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <vector>

using namespace std;

vector<int> v[8200];
int st[8200],dr[8200],rez[8200],cup1[8200],cup2[8200];
char vaz[8200];

int cupleaza(int nod)
{
    if(vaz[nod]==1) return 0;
    vaz[nod]=1;
    for(int i=0;i<v[nod].size();i++)
        if(cup2[v[nod][i]]==0 or cupleaza(cup2[v[nod][i]])>0)
        {
            cup1[nod]=v[nod][i];
            cup2[v[nod][i]]=nod;
            return 1;
        }
    return 0;
}

void dfs(int nod)
{
    for(int i=0;i<v[nod].size();i++)
    {
        int vec=v[nod][i];
        if(dr[vec]==0)
        {
            dr[vec]=1;
            st[cup2[vec]]=0;
            dfs(cup2[vec]);
        }
    }
}

int main()
{
    freopen("felinare.in","r",stdin);
    freopen("felinare.out","w",stdout);
    int n,m,x,y,sol=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
    }
    int ok=1;
    while(ok>0)
    {
        ok=0;
        for(int i=1;i<=n;i++) vaz[i]=0;
        for(int i=1;i<=n;i++)
            if(cup1[i]==0) ok+=cupleaza(i);
    }
    for(int i=1;i<=n;i++)
        if(cup1[i]>0) {sol++;st[i]=1;}
    printf("%d\n",2*n-sol);
    for(int i=1;i<=n;i++)
        if(st[i]==0) dfs(i);
    for(int i=1;i<=n;i++)
        if(st[i]==0) rez[i]=1;
    for(int i=1;i<=n;i++)
        if(dr[i]==0)
        {
            if(rez[i]==0) rez[i]=2;
            else rez[i]=3;
        }
    for(int i=1;i<=n;i++) printf("%d\n",rez[i]);
    return 0;
}