Cod sursa(job #1659761)

Utilizator GinguIonutGinguIonut GinguIonut Data 22 martie 2016 16:18:45
Problema Felinare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>
#include <string.h>
#include <vector>

#define nMax 8200
#define pb push_back

using namespace std;
ifstream fin("felinare.in");
ofstream fout("felinare.out");
int n, m, cuplaj;
int l[nMax], r[nMax], suppr[nMax], suppl[nMax], viz[nMax];
vector<int> G[nMax];
void read()
{
    int x, y;
    fin>>n>>m;

    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        G[x].pb(y);
    }
}
int pairup(int node)
{
    if(viz[node])
        return 0;
    viz[node]=1;

    for(vector<int>::iterator it=G[node].begin();it!=G[node].end();it++)
    {
        int fiu=*it;
        if(!r[fiu])
        {
            r[fiu]=node;
            l[node]=fiu;
            cuplaj++;
            suppl[node]=1;
            return 1;
        }
    }

    for(vector<int>::iterator it=G[node].begin();it!=G[node].end();it++)
    {
        int fiu=*it;
        if(pairup(r[fiu]))
        {
            r[fiu]=node;
            l[node]=fiu;
            suppl[node]=1;
            cuplaj++;
            return 1;
        }
    }

    return 0;
}
void support(int node)
{
    for(vector<int>::iterator it=G[node].begin();it!=G[node].end();it++)
    {
        int fiu=*it;
        if(!suppr[fiu])
        {
            suppr[fiu]=1;
            suppl[r[fiu]]=0;
            support(r[fiu]);
        }
    }
}
void solve()
{
    for(int change=1;change;)
    {
        change=0;
        memset(viz, 0, sizeof(viz));
        for(int i=1;i<=n;i++)
            if(!l[i])
                change |= pairup(i);
    }

    for(int i=1;i<=n;i++)
        if(!suppl[i])
            support(i);
}
void write()
{
    fout<<2*n-cuplaj<<'\n';

    for(int i=1;i<=n;i++)
        fout<<(1-suppl[i]+2*(1-suppr[i]))<<'\n';
}
int main()
{
    read();
    solve();
    write();
    return 0;
}