Cod sursa(job #2344725)

Utilizator victorv88Veltan Victor victorv88 Data 15 februarie 2019 15:37:55
Problema Cuplaj maxim in graf bipartit Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

#define NMAX 10005
using namespace std;

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

int cardinal_stanga, cardinal_dreapta, nr_muchii, vecin_dreapta[NMAX], vecin_stanga[NMAX];
vector<int>graph[NMAX];
bool ok;
int viz[NMAX];

bool cuplaj (int ind)
{
    if (viz[ind])
        return false;
    viz[ind]=true;
    for (auto &v:graph[ind])
    {
        if (!vecin_stanga[v])
        {
            vecin_dreapta[ind]=v;
            vecin_stanga[v]=ind;
            return true;
        }
    }
    for (auto &v:graph[ind])
    {
        if (cuplaj(vecin_stanga[v]))
        {
            vecin_dreapta[ind]=v;
            vecin_stanga[v]=ind;
            return true;
        }
    }
}

int main() {
    int st, dr;
    f >> cardinal_stanga >> cardinal_dreapta >> nr_muchii;
    for (int i=1; i<=nr_muchii; i++)
    {
        f >> st >> dr;
        graph[st].push_back(dr);
    }
    ok=true;
    while (ok)
    {
        ok=false;
        memset(viz,0,NMAX);
        for (int i=1; i<=cardinal_stanga; i++)
        {
            if (!vecin_dreapta[i])
            {
                ok=ok|cuplaj(i);
            }
        }
    }
    int nr=0;
    for (int i=1; i<=cardinal_stanga; ++i)
    {
        if (vecin_dreapta[i])
            nr++;
    }
    g << nr << '\n';
    for (int i=1; i<=cardinal_stanga; ++i)
    {
        if (vecin_dreapta[i])
        {
            g << i <<' ' << vecin_dreapta[i] << '\n';
        }
    }
    return 0;
}