Cod sursa(job #1294619)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 17 decembrie 2014 21:43:29
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("felinare.in");
ofstream g("felinare.out");
vector <int> G[10005];
int ind,ind2;
bool Use[10005],UseL[10005],UseR[10005];
int L[10005],R[10005];
int N,M,E;

void Read()
{
    int i,j,value;
    f>>N>>M;
    for(i=1;i<=M;i++)
    {
        int x,y;
        f>>x>>y;
        G[x].push_back(y);
    }
}
bool pairup(int n)
{
    unsigned int i=0;
    if(Use[n]==1)
        return 0;
    Use[n]=1;
    for(i=0;i<G[n].size();i++)
    {
        int vecin=G[n][i];
        if(R[vecin]==0)
        {
            R[vecin]=n;
            L[n]=vecin;
            UseR[n]=1;
            return 1;
        }
    }
    for(i=0;i<G[n].size();i++)
    {
        int vecin=G[n][i];
        if(pairup(R[vecin])==1)
        {
            R[vecin]=n;
            L[n]=vecin;
            UseR[n]=1;
            return 1;
        }
    }
     return 0;
}
void Cuplaj()
{
    int i,cuplaj=0;
    bool change=1;
    while(change==1)
    {
        change=0;
        memset(Use,0,sizeof(Use));
        for(i=1;i<=N;i++)
            if(L[i]==0)
                change |=pairup(i);
    }
    for(i=1;i<=N;i++)
        if(L[i]>0)
            cuplaj++;
    g<<2*N-cuplaj<<"\n";
}
void PairUp(int node)
{
    for(int i=0;i<G[node].size();i++)
    {
        int neighb=G[node][i];
        if(UseL[neighb]==0)
        {
            UseL[neighb]=1;
            UseR[R[neighb]]=0;
            PairUp(R[neighb]);
        }
    }

}
void Support()
{
    int i;
    for(int i=1;i<=N;i++)
        if(UseR[i]==0)
        {
            PairUp(i);
        }
    for(int i=1;i<=N;i++)
    {
        if(UseL[i]==0 && UseR[i]==0)
        {
            g<<3<<"\n";
            continue;
        }
        if(UseL[i]==1 && UseR[i]==0)
        {
            g<<1<<"\n";
            continue;
        }
        if(UseL[i]==0 && UseR[i]==1)
        {
            g<<2<<"\n";
            continue;
        }
        g<<0<<'\n';
    }

}
int main()
{
    Read();
    Cuplaj();
    Support();
    return 0;
}