Cod sursa(job #2771473)

Utilizator Uriesu_IuliusUriesu Iulius Uriesu_Iulius Data 27 august 2021 14:49:06
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.26 kb
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ipair pair<int, int>

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

const int mxN=1e4, mxK=1e5, inf=1e9;
int n, m, k, d[2*mxN+2], p[2*mxN+2];
vector<int> G[2*mxN+2];
struct edge
{
    int u, v, rev, cap;
};
edge E[2*(mxK+2*mxN)];

int main()
{
    fin >> n >> m >> k;
    int id=0;
    for(int i=1; i<=n; i++)
    {
        E[2*id]={0, i, 2*id+1, 1};
        E[2*id+1]={i, 0, 2*id, 0};
        G[0].push_back(2*id);
        G[i].push_back(2*id+1);
        id++;
    }
    for(int i=1; i<=m; i++)
    {
        E[2*id]={n+i, n+m+1, 2*id+1, 1};
        E[2*id+1]={n+m+1, n+i, 2*id, 0};
        G[n+i].push_back(2*id);
        G[n+m+1].push_back(2*id+1);
        id++;
    }
    for(int i=0; i<k; i++)
    {
        int a, b;
        fin >> a >> b;
        b+=n;
        E[2*id]={a, b, 2*id+1, 1};
        E[2*id+1]={b, a, 2*id, 0};
        G[a].push_back(2*id);
        G[b].push_back(2*id+1);
        id++;
    }
    int flow=0;
    while(1)
    {
        for(int i=0; i<=n+m+1; i++)
            d[i]=inf, p[i]=-1;
        d[0]=0;
        queue<int> Q;
        Q.push(0);
        bool found=false;
        while(!Q.empty() && !found)
        {
            int u=Q.front();
            Q.pop();
            for(int i : G[u])
            {
                int v=E[i].v;
                if(d[v]==inf && E[i].cap)
                {
                    d[v]=d[u]+1;
                    p[v]=i;
                    if(v==n+m+1)
                        found=true;
                    Q.push(v);
                }
            }
        }
        if(!found)
        {
            fout << flow << '\n';
            for(int i=0; i<2*id; i+=2)
                if(E[i].u>=1 && E[i].u<=n && E[i].v-n>=1 && E[i].v-n<=m && !E[i].cap)
                    fout << E[i].u << ' ' << E[i].v-n << '\n';
            return 0;
        }
        int e=p[n+m+1], bn=inf;
        while(e!=-1)
        {
            bn=min(bn, E[e].cap);
            e=p[E[e].u];
        }
        flow+=bn;
        e=p[n+m+1];
        while(e!=-1)
        {
            E[e].cap-=bn;
            E[E[e].rev].cap+=bn;
            e=p[E[e].u];
        }
    }
    return 0;
}