Cod sursa(job #2981965)

Utilizator gabriel10tm@gmail.comGabriel Marian [email protected] Data 19 februarie 2023 12:23:31
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
using namespace std;
const int nmx = 1e4 + 2;
vector<int> ad[nmx];
int st[nmx]; // st[A] = B
int dr[nmx]; // dr[B] = A
int viz[nmx];
int n,m,e;
int flg = 0;
#if 1
#define cin fin
#define cout fout
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
#endif // 1

bool dfs(int k){ // k - nod din A
    if(k==0)
        return 0;
    if(viz[k])
        return 0;
    viz[k] = 1;
    for(int to : ad[k]){
        if(!dr[to] || dfs(dr[to])){
            dr[to] = k;
            st[k] = to;
            return 1;
        }
    }
    return 0;
}

int ans = 0;

void kuhn(){
    int ok = 0;
    do{
        ok = 0;
        memset(viz,0,sizeof(viz));
        for(int i=1;i<=n;i++)
            if(!st[i]){
                int res = dfs(i);
                ans += res;
                ok |= res;
            }
    }while(ok);
}

int main(){
    cin >> n >> m >> e;
    while(e--){
        int u,v;
        cin >> u >> v;
        ad[u].push_back(v);
    }
    kuhn();
    cout << ans << '\n';
    for(int i=1;i<=n;i++)
        if(st[i])
            cout << i << " " << st[i] << "\n";
}