Cod sursa(job #3336560)

Utilizator G3K0Airinei Gabriel Vlad G3K0 Data 24 ianuarie 2026 21:52:42
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <bits/stdc++.h>
using namespace std;
const int nmax=2e4+5;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector <vector<int>>adj; 
vector<vector<int>> capacity;
vector<int>parent;
vector<pair<int,int>> ans;
int bfs (int s ,int t)
{
    fill(parent.begin(),parent.end(),-1);
    parent[s]=-2;
    queue<pair<int,int>> q;
    q.push({s,INT_MAX});
    while(!q.empty())
    {
        int nod=q.front().first;
        int flow=q.front().second;
        q.pop();
        for(auto it : adj[nod])
        if(parent[it]==-1 && capacity[nod][it])
        {
            parent[it]=nod;
            int new_flow=min(flow,capacity[nod][it]);
            if(it==t)
                return new_flow;
            q.push({it,new_flow});
        }
        
    }
    return 0;
}
int maxflow(int s,int t)
{
    int flow=0;
    int new_flow;
    while(new_flow=bfs(s,t))
    {
        flow+=new_flow;
        int nod =t;
        ans.push_back({parent[parent[t]],parent[t]});
        while(nod!=s)
        {
            int prev=parent[nod];
            capacity[prev][nod]-=new_flow;
            capacity[nod][prev]+=new_flow;
            nod=prev;
        }

    }
    return flow;
}


int main ()
{
    int n ,m,k;
    f>>n>>m>>k;
    parent.resize(nmax);
    capacity.resize(nmax);
    adj.resize(nmax);
    capacity[0].resize(nmax);
    capacity[n+m+1].resize(nmax);
    for(int i=1;i<=n+m;i++)
        {capacity[i].resize(nmax);
            if(i<=n)
                {
                    adj[i].push_back(0);
                    adj[0].push_back(i);
                    capacity[0][i]=1;

                }
                else{
                     adj[i].push_back(n+m+1);
                    adj[n+m+1].push_back(i);
                    capacity[i][n+m+1]=1;

                }

        }

    
    while(k--)
    {
        int x,y;
        f>>x>>y;
        adj[x].push_back(y+n);
        adj[y+n].push_back(x);

        capacity[x][y+n]=1;
    }
    g<<maxflow(0,n+m+1)<<'\n';
    for(auto it : ans)
        g<<it.first<<' '<<it.second-n<<'\n';

}