Cod sursa(job #2818419)

Utilizator StefaniaCriStefania Cristea StefaniaCri Data 16 decembrie 2021 00:26:08
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
#define Nmax 100007
#define inf 100000
#define NIL 0
int n,m,e;
vector<int> la[Nmax];
vector <int> pairU;
vector <int> pairV;
vector <int> dist;
bool bfs_cuplaj()
{
    queue<int> coada;
    for(int i=1;i<=n;i++)
    {
        //daca nodul e liber
        if(pairU[i]==NIL)
        {
            dist[i]=0;
            coada.push(i);
        }
        else dist[i]=inf;
    }
    dist[NIL]=inf;

    while(!coada.empty())
    {
        int cur = coada.front();
        coada.pop();
        if(dist[cur]<dist[NIL])
        {
            for(auto v:la[cur])
            {
                if(dist[pairV[v]]==inf)
                {
                    dist[pairV[v]] = dist[cur]+1;
                    coada.push(pairV[v]);
                }
            }
        }
    }
    return (dist[NIL]!=inf);
}

bool dfs_cuplaj(int u)
{
    if(u!=0)
    {
        for(auto v:la[u])
        {
            if(dist[pairV[v]] == dist[u]+1)
            {
                if(dfs_cuplaj(pairV[v])==true)
                {
                    pairV[v]=u;
                    pairU[u]=v;
                    return true;
                }
            }
        }
        dist[u]=inf;
        return false;
    }
    return true;
}

void cuplaj()
{
    pairU.resize(n+1,NIL);
    pairV.resize(m+1,NIL);
    dist.resize(e+1,NIL);
    int result=0;

    while(bfs_cuplaj()) //cat timp exista o augmentare
    {
        for(int i=1;i<=n;i++)
        if(pairU[i] == 0 && dfs_cuplaj(i))
            result++;
    }
    g<<result<<"\n";
    for(int i=1;i<=m;i++)
        if(pairV[i]>0)
        g<<pairV[i]<<" "<<i<<"\n";
}

int main()
{
    int x,y;

    f>>n>>m>>e;
    for(int i=1;i<=e;i++){
        f>>x>>y;
        la[x].push_back(y);
    }
    cuplaj();
    return 0;
}