Cod sursa(job #2244987)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 24 septembrie 2018 15:11:06
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 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;
    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;
        }
    }
    /// altfel, caut alta modalitate
    for (i=0;i<v[nod].size();i++){
        vecin=v[nod][i];
        if (!f[r[vecin]] && 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;
}