Cod sursa(job #1948722)

Utilizator GinguIonutGinguIonut GinguIonut Data 1 aprilie 2017 12:58:19
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <vector>
#include <string.h>

#define nMax 8192
#define pb push_back

using namespace std;

ifstream fin("felinare.in");
ofstream fout("felinare.out");

int n, m, cuplaj;
int viz[nMax], suppl[nMax], suppr[nMax], r[nMax], l[nMax];
vector<int> G[nMax];

bool 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(l[fiu]==0)
        {
            r[node]=fiu;
            suppl[node]=1;
            l[fiu]=node;
            cuplaj++;
            return 1;
        }
    }

    for(vector<int>::iterator it=G[node].begin(); it!=G[node].end(); it++)
    {
        int fiu=*it;
        if(pairup(l[fiu]))
        {
            r[node]=fiu;
            suppl[node]=1;
            l[fiu]=node;
            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]==0)
        {
            suppr[fiu]=1;
            suppl[l[fiu]]=0;
            support(l[fiu]);
        }
    }
}

int main()
{
    int a, b;
    fin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        fin>>a>>b;
        G[a].pb(b);
    }

    for(int change=1; change; )
    {
        change=0;
        memset(viz, 0, sizeof(viz));
        for(int node=1; node<=n; node++)
            if(r[node]==0)
                change|=pairup(node);
    }

    for(int node=1; node<=n; node++)
        if(suppl[node]==0)
            support(node);


    fout<<2*n-cuplaj<<'\n';
    for(int i=1; i<=n; i++)
        fout<<(1-suppl[i]+2*(1-suppr[i]))<<'\n';
}