Cod sursa(job #3364297)

Utilizator cKalbfleischcoraline Kalbfleisch cKalbfleisch Data 1 septembrie 2026 11:59:15
Problema Cuplaj maxim in graf bipartit Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.6 kb
#include <bits/stdc++.h>
using namespace std;

struct edge{
    int from,to,cap;
    bool isR;
    edge* rev;
    edge(int f,int t,int c,bool b){
        from=f;to=t;cap=c;
        isR=b;
    }
};

int inf=1000000000;

int nax;

class cDinic{
public:
    int N;
    vector<vector<edge*>> adj;
    vector<int> lev;

    void start(int n){
        N=n;
        adj.resize(N);
    }

    void addE(int a, int b, int cp, bool r){
        edge* f = new edge(a,b,cp,r);
        edge* bck = new edge(b,a,0,false);
        f->rev = bck;
        bck->rev = f;
        adj[a].push_back(f);
        adj[b].push_back(bck);
    }

    int S,T;

    bool bfs(){
        lev.assign(N, -1);
        queue<int> q;
        lev[S] = 0;
        q.push(S);

        while(!q.empty()){
            int n = q.front(); q.pop();
            for(auto e : adj[n]){
                if(e->cap > 0 && lev[e->to] == -1){
                    lev[e->to] = lev[n] + 1;
                    q.push(e->to);
                }
            }
        }
        return lev[T] != -1;
    }

    int dfs(int n, int flow){
        if(n == T) return flow;
        for(auto e : adj[n]){
            if(e->cap > 0 && lev[e->to] == lev[n] + 1){
                int pushed = dfs(e->to, min(flow, e->cap));
                if(pushed > 0){
                    e->cap -= pushed;
                    e->rev->cap += pushed;
                    return pushed;
                }
            }
        }
        return 0;
    }

    int maxF(int s, int t){
        S=s; T=t;
        int mxF = 0;
        while(bfs()){
            while(int pushed = dfs(S, inf)){
                mxF += pushed;
            }
        }
        return mxF;
    }

    void outG(){
        for(int i=0;i<N;i++){
            for(auto e: adj[i]){
                if(e->isR && e->rev->cap>0){
                    cout<<e->from<<" "<<e->to-nax<<"\n";
                }
            }
        }
    }
};

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);

    int na, nb, M;
    cin >> na >> nb >> M;
    nax=na;

    int S = 0;
    int T = na + nb + 1;

    cDinic g;
    g.start(T + 1);

    for(int a = 1; a <= na; a++)
        g.addE(S, a, 1, false);

    for(int b = 1; b <= nb; b++)
        g.addE(na + b, T, 1, false);

    for(int i = 0; i < M; i++){
        int a, b;
        cin >> a >> b;
        b += na; 
        g.addE(a, b, 1, true);
    }

    int maxF = g.maxF(S, T);
    cout << maxF << "\n";
    g.outG();
}