Cod sursa(job #2474351)

Utilizator Catalin2002Catalin Craciun Catalin2002 Data 15 octombrie 2019 07:18:06
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.9 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

vector <int> v1[10005];

int pereche_r[10000];
int pereche_l[10000];

bool fa_o_pereche(int x)
{
    int i,aux;

    for(i=0;i<v1[x].size();i++)
        if(pereche_r[ v1[x][i] ] == 0)
        {
            pereche_r[ v1[x][i] ]= x;

            pereche_l[x]= v1[x][i];

            return true;
        }

    for(i=0;i<v1[x].size();i++)
    {
        if(pereche_r[ v1[x][i] ] == -1)
            continue;

        aux =pereche_r[ v1[x][i] ];
        pereche_r[ v1[x][i] ] =-1;

        if(fa_o_pereche(aux))
        {
            pereche_r[ v1[x][i] ]= x;
            return true;
        }
        else
            pereche_r[ v1[x][i] ]= aux;

    }

    return false;
}


int main()
{
    int n,m,e,x,y,i,ct=0;

    bool sem= false;

    fin>>n>>m>>e;

    for(i=1;i<=e;i++)
    {
        fin>>x>>y;

        v1[x].push_back(y);

    }


    while(sem)
    {
        sem= false;
        for(i=1;i<=n;i++)
        if(fa_o_pereche(i))
        {
            ct++;
            sem=true;
        }
    }


    fout<<ct<<"\n";

    for(i=1;i<=m;i++)
        if(pereche_r[i]!=0)
        {
            fout<<pereche_r[i]<<" "<<i<<"\n";

        }




    return 0;
}
/*
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <unordered_set>
#include <climits>
#include <bitset>

using namespace std;

ifstream in("cuplaj.in");
ofstream out("cuplaj.out");

int n,m,e;
int N;
vector<int> E[10003];
int L[10003];
int R[10003];
bitset<10003> u;

bool pairup(int nod) {

    bool verif=u[nod];

    if(u[nod])
        return 0;
    u[nod] = 1;

    verif=u[nod];
    //cout << nod << " " << L[nod] << '\n';

    for(int i = 0; i < E[nod].size(); i++) {
        if(R[E[nod][i]] == 0) {
            L[nod] = E[nod][i];
            R[E[nod][i]] = nod;
            return 1;
        }
    }

    for(int i = 0; i < E[nod].size(); i++) {
        if(pairup(R[E[nod][i]])) {
            L[nod] = E[nod][i];
            R[E[nod][i]] = nod;
            return 1;
        }
    }

    return 0;

}

int main() {

    in >> n >> m >> e;
    int x,y;

    for(int i = 1; i <= e; i++) {
        in >> x >> y;
        E[x].push_back(y);
    }

    int cup = 0;
    bool f = true;

    while(f) {

        f = false;

        for(int j = 1; j <= n; j++)
            u[j] = 0;
        for(int i = 1; i <= n; i++) {
            if(L[i] != 0)
                continue;
            if(pairup(i)) {
                f = true;
                cup++;
            }
        }

    }

    out << cup << '\n';

    for(int i = 1; i <= n; i++) {
        if(L[i] == 0)
            continue;
        out << i << " " << L[i] << '\n';
    }

    return 0;
}*/