Cod sursa(job #2106931)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 16 ianuarie 2018 15:53:31
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<bits/stdc++.h>
#define dim 100005
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int dreapta[dim],stanga[dim],st,dr,m,a,b;
bool marked[dim],ok;
vector<int>v[dim];
bool dfs(int nod)
{
    if(marked[nod])
        return 0;
    marked[nod] = 1;
    for (int i = 0; i < v[nod].size(); i ++)
    {
        int vecin = v[nod][i];
        if (!dreapta[vecin])
        {
            stanga[nod] = vecin;
            dreapta[vecin] = nod;
            return 1;
        }
    }
    for (int i = 0; i < v[nod].size(); i ++)
    {
        int vecin = v[nod][i];
        if (dfs (dreapta[vecin]))
        {
            stanga[nod] = vecin;
            dreapta[vecin] = nod;
            return 1;
        }
    }
    return 0;
}
void HK()
{
    ok =1;
    while (ok)
    {
        memset(marked,0,st+2);
        ok = false;
        for (int i =1; i <= st; i ++)
            if (!stanga[i]  && dfs(i))
                ok =1;
    }
}
int main()
{
    f>>st>>dr>>m;
    for(int i=1;i<=m;i++)
    {
        f>>a>>b;
        v[a].push_back(b);
    }
    HK();
    int cuplaje =0;
    for (int i =1; i <= st; i ++)
        if(stanga[i])
            cuplaje++;
    g<<cuplaje<<'\n';
    for (int i = 1; i <= st; i ++)
        if (stanga[i])
            g<<i<<" "<< stanga[i]<<'\n';
    return 0;
}