Cod sursa(job #2979789)

Utilizator biancalautaruBianca Lautaru biancalautaru Data 15 februarie 2023 21:15:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <cstring>
#include <vector>
#define DIM 10001
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n,m,k,x,y,cnt,st[DIM],dr[DIM];
bool ok,f[DIM];
vector<int> l[DIM];

bool cupleaza(int nod) {
    if (f[nod]==1)
        return 0;
    f[nod]=1;
    for (int i=0;i<l[nod].size();i++) {
        int vec=l[nod][i];
        if (dr[vec]==0) {
            st[nod]=vec;
            dr[vec]=nod;
            cnt++;
            return 1;
        }
    }
    for (int i=0;i<l[nod].size();i++) {
        int vec=l[nod][i];
        if (cupleaza(dr[vec])==1) {
            st[nod]=vec;
            dr[vec]=nod;
            return 1;
        }
    }
    return 0;
}

int main() {
    fin>>n>>m>>k;
    while (k--) {
        fin>>x>>y;
        l[x].push_back(y);
    }
    do {
        ok=0;
        memset(f,0,sizeof(f));
        for (int i=1;i<=n;i++)
            if (st[i]==0 && cupleaza(i)==1)
                ok=1;
    } while (ok==1);
    fout<<cnt<<"\n";
    for (int i=1;i<=n;i++)
        if (st[i]!=0)
            fout<<i<<" "<<st[i]<<"\n";
    return 0;
}