Cod sursa(job #1921774)

Utilizator KimerthSilviu Motfolea Kimerth Data 10 martie 2017 14:17:32
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>

using namespace std;

#define NMAX 10002
#define INF INT_MAX

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

vector<int> U[NMAX], V[NMAX];
int dist[2 * NMAX];
int U_pair[NMAX], V_pair[NMAX];

int n, m;

#define NIL n + 1

bool BFS()
{
    queue<int> Q;
    for(int i = 1; i <= n; i++)
        if(U_pair[i] == NIL)
        {
            dist[i] = 0;
            Q.push(i);
        }
        else
            dist[i] = INF;

    dist[NIL] = INF;

    while(!Q.empty())
    {
        int u = Q.front();
        Q.pop();

        if(dist[u] < dist[NIL])
            for(int i = 0; i < U[u].size(); i++)
            if(dist[V_pair[U[u][i]]] == INF)
            {
                dist[V_pair[U[u][i]]] = dist[u] + 1;
                Q.push(V_pair[U[u][i]]);
            }
    }

    return dist[NIL] != INF;
}

bool DFS(int u)
{
    if(u != NIL)
    {
        for(int i = 0; i < U[u].size(); i++)
            if(dist[V_pair[U[u][i]]] == dist[u] + 1)
                if(DFS(V_pair[U[u][i]]))
                {
                    V_pair[U[u][i]] = u;
                    U_pair[u] = U[u][i];
                    return true;
                }
        dist[u] = INF;
        return false;
    }
    return true;
}

int main()
{
    int e;
    fin >> n>> m >> e;

    for(int i = 0; i < e; i++)
    {
        int u, v;
        fin >> u >> v;
        U[u].push_back(v);
        V[v].push_back(u);
    }

    for(int i = 1; i <= m; i++)
        U[n + 1].push_back(i);

    for(int i = 1; i <= n; i++)
        U_pair[i] = NIL;
    for(int i = 1; i <= m; i++)
        V_pair[i] = NIL;

    int matching = 0;
    while(BFS())
    {
        for(int i = 1; i <= n; i++)
            if(U_pair[i] == NIL)
                if(DFS(i))
                    matching ++;
    }
    fout << matching << '\n';

    for(int i = 1; i <= n; i++)
        if(U_pair[i] != NIL)
            fout << i << ' ' << U_pair[i] << '\n';
}