Cod sursa(job #1892519)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 25 februarie 2017 01:10:24
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>
#include<fstream>
#include<vector>
#include<cstring>
using namespace std;
#define N 10100
#define DIM 1000
vector<int> a[N];
char buff[DIM];
int poz;
int viz[N],l[N],v[N],r[N],i,j,n,m,k,nr;
///l[i] perechea din stanga a lui i
///r[i] perechea din dreapta a lui i
bool ok;
bool pairup(int n)
{
    if(viz[n])return 0;
    viz[n]=1;///daca am continuat inseamna ca n e neutilizat,deci ii caut pereche
    int nod;
    for(int i=0;i<v[n];++i)
    {
        nod=a[n][i];
        if(!l[nod]) ///verific vecinii lui n pana cand gasesc unul neutilizat si formez pereche
        {
            r[n]=nod;
            l[nod]=n;
            return 1;
        }
    }
    for(int i=0;i<v[n];++i) ///daca am ajuns aici inseamna ca toti vecinii lui n au deja pereche
    {
        nod=a[n][i];
        if(pairup(l[nod]))///verific perechea vecinului
        {
            r[n]=nod;///creare muchie noua
            l[nod]=n;
            return 1;
        }
    }
    return 0;///nu s-a mai gasit vreo muchie posibila
}
ifstream f("cuplaj.in");
void R(int&x)
{
    x=0;
    while(buff[poz]<'0' || buff[poz]>'9')
        if(++poz==DIM)
        {
            poz=0;
            f.read(buff,DIM);
        }
    while(buff[poz]>='0' && buff[poz]<='9')
    {
         x=x*10+buff[poz]-'0';
         if(++poz==DIM)
         {
             poz=0;
             f.read(buff,DIM);
         }
    }
}
int main()
{
    R(n);R(m);R(k);
    for(int l=0;l<k;++l)
    {
        R(i);R(j);
        a[i].push_back(j);
        ++v[i];
    }
    ok=1;
    while(ok)
    {
        ok=0;
        memset(viz,0,(n+1)*sizeof(int));
        for(i=1;i<=n;++i)
            if(!r[i])///verific daca nodul i are pereche
                ok|=pairup(i);///efectuez secventa cat timp se mai pot crea muchii
            /// "|=" sau logic
    }
    nr=0;
    for(i=1;i<=n;++i)
        if(r[i])++nr;
    ofstream g("cuplaj.out");
    g<<nr<<'\n';
    for(i=1;i<=n;++i)
        if(r[i])
            g<<i<<" "<<r[i]<<'\n';
    return 0;
}