Cod sursa(job #2739148)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 6 aprilie 2021 22:35:09
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <fstream>
#include <vector>
#include <queue>
#define MAX_SIZE 100005
#define INF 0x3F3F3F3F
#define DUMMY 0
using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

vector<int> graph[MAX_SIZE];
int pairU[MAX_SIZE], pairV[MAX_SIZE];
int dist[MAX_SIZE];
int n, m, e;

void init()
{
    for(int i = 1; i<=n; i++)
        pairU[i] = DUMMY;
    for(int i = 1; i<=m; i++)
        pairV[i] = DUMMY;
}

void read()
{
    int u, v;
    f>>n>>m>>e;
    for(int i = 0; i<e; i++)
    {
        f>>u>>v;
        graph[u].push_back(v);
    }
}

bool bfs()
{
    queue<int> Q;

    for(int i = 1; i<=n; i++)
    {
        if(pairU[i] == 0)
        {
            dist[i] = 0;
            Q.push(i);
        }
        else
            dist[i] = INF;
    }
    dist[DUMMY] = INF;

    while(!Q.empty())
    {
        int u = Q.front();
        Q.pop();
        if(dist[u] < dist[DUMMY])
        {
            for(auto &v : graph[u])
            {
                if(dist[pairV[v]] == INF)
                {
                    dist[pairV[v]] = dist[u] + 1;
                    Q.push(pairV[v]);
                }
            }
        }
    }

    return dist[DUMMY] != INF;
}

bool dfs(int u)
{
    if(u != DUMMY)
    {
        for(auto &v : graph[u])
        {
            if(dist[pairV[v]] == dist[u] + 1)
            {
                if(dfs(pairV[v]))
                {
                    pairV[v] = u;
                    pairU[u] = v;
                    return true;
                }
            }
        }
        dist[u] = INF;
        return false;
    }
    return true;
}

void solve()
{
    int sol = 0;
    while(bfs())
    {
        for(int u = 1; u <= n; u++)
            if(pairU[u] == DUMMY && dfs(u))
                sol++;
    }
    g<<sol<<"\n";
}

void print()
{
    for(int u = 1; u<=n; u++)
    {
        if(pairU[u] != DUMMY)
        {
            g<<u<<" "<<pairU[u]<<"\n";
        }
    }
}

int main()
{
    init();
    read();
    solve();
    print();
    return 0;
}