Cod sursa(job #2244994)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 24 septembrie 2018 15:28:10
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <bitset>
#include <vector>

using namespace std;
bitset <10001> f;
vector <int> v[10001];
int l[10001],r[10001];
int cuplez (int nod){
    int i,vecin;
    //if (nod==2)
    //printf ("%d\n",nod);
    if (f[nod])
        return 0;
    f[nod]=1;
    for (i=0;i<v[nod].size();i++){
        vecin=v[nod][i];
        if (!r[vecin]){ /// il cuplez direct
            l[nod]=vecin;
            r[vecin]=nod;
            return 1;
        }
    }
    //if (nod==2)
      //  printf ("%d\n",nod);
    f[nod]=1;
    /// altfel, caut alta modalitate
    for (i=0;i<v[nod].size();i++){
        vecin=v[nod][i];
        if (cuplez (r[vecin])){ /// il pot cupla pe nod cu vecin
            l[nod]=vecin;
            r[vecin]=nod;
            return 1;
        }
    }
    return 0;
}
int main()
{
    FILE *fin=fopen ("cuplaj.in","r");
    FILE *fout=fopen ("cuplaj.out","w");
    int st,dr,m,x,y,ok,i,sol;
    fscanf (fin,"%d%d%d",&st,&dr,&m);
    for (i=1;i<=m;i++){
        fscanf (fin,"%d%d",&x,&y);
        v[x].push_back(y);
        //v[y].push_back(x);
    }
    do{
        ok=0;
        f.reset();
        for (i=1;i<=st;i++){
            if (!l[i])
                ok=(ok|cuplez(i));
        }
    }
    while (ok==1);
    sol=0;
    for (i=1;i<=dr;i++)
        if (r[i])
            sol++;
    fprintf (fout,"%d\n",sol);
    for (i=1;i<=dr;i++)
        if (r[i])
            fprintf (fout,"%d %d\n",r[i],i);
    return 0;
}