Cod sursa(job #3360321)

Utilizator lucaje123Vartolomei Luca lucaje123 Data 12 iulie 2026 11:12:55
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <queue>
using namespace std;

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

const int INF=1e9;

int n, m, q;

vector<int> adj[200005];
vector<int> pereche_st, pereche_dr;
vector<int> dist;

int bfs(){
    queue<int> q;
    for(int i=1;i<=n;i++){
        if(pereche_st[i]==0){
            q.push(i);
            dist[i]=0;
        }
        else{
            dist[i]=INF;
        }
    }
    dist[0]=INF;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        if(dist[u]<dist[0]){
            for(int v:adj[u]){
                if(dist[pereche_dr[v]]==INF){
                    dist[pereche_dr[v]]=dist[u]+1;
                    q.push(pereche_dr[v]);
                }
            }
        }
    }
    return dist[0]!=INF;
}

int dfs(int u){
    if(u!=0){
        for(int v:adj[u]){
            if(dist[pereche_dr[v]]==dist[u]+1){
                if(dfs(pereche_dr[v])){
                    pereche_st[u]=v;
                    pereche_dr[v]=u;
                    return true;
                }
            }
        }
        dist[u]=INF;
        return false;
    }
    return true;
}

int hopcroft_karp(){
    pereche_st.assign(n+1, 0);
    pereche_dr.assign(n+m+1, 0);
    dist.assign(n+1, 0);

    int cuplaj=0;

    while(bfs()){
        for(int i=1;i<=n;i++){
            if(pereche_st[i]==0&&dfs(i)){
                cuplaj++;
            }
        }
    }
    return cuplaj;
}

int main(){
    cin>>n>>m>>q;
    for(int i=1;i<=q;i++){
        int x,y;
        cin>>x>>y;
        adj[x].push_back(n+y);
    }
    cout<<hopcroft_karp()<<'\n';
    for(int i=1;i<=n;i++){
        if(pereche_st[i]!=0){
            cout<<i<<" "<<pereche_st[i]-n<<'\n';
        }
    }
}