Cod sursa(job #1550172)

Utilizator VladCiofuCiofu Vlad VladCiofu Data 13 decembrie 2015 12:45:12
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>

using namespace std;

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

int viz[20003], n, na, m, e[20003], v[20003][20003], c[20003];

void clearViz()
{
    for(int i = 1; i < n; i++) viz[i] = 0;
}

void init()
{
    fin >> na >> n >> m;

    n += na;

    for(int i = 1; i <= m; i++)
    {
        int x, y;

        fin >> x >> y;

        y += na;

        e[x]++;
        e[y]++;

        v[x][e[x]] = y;
        v[y][e[y]] = x;
    }
}

int dfs(int a)
{
    viz[a] = 1;

    for(int i = 1; i <= e[a]; i++)
    {
        int y = v[a][i];

        if(viz[y] || c[i] == y) continue;

        viz[y] = 1;

        if(c[y] == 0)
        {
            c[a] = y;
            c[y] = a;

            viz[y] = 1;

            return 1;
        }
        else
        {
            if(dfs(c[y]))
            {
                c[a] = y;
                c[y] = a;

                return 1;
            }
            else continue;
        }
    }

    return 0;
}

int main()
{
    init();

    int ok = 1, nrc = 0;

    while(ok == 1)
    {
        ok = 0;

        clearViz();

        for(int i = 1; i <= na; i++)
        {
            if(!viz[i] && c[i] == 0)

                if(dfs(i))
                {
                    ok = 1;

                    nrc++;
                }
        }
    }

    fout << nrc << endl;

    for(int i = 1; i <= na; i++)
    {
        if(c[i] != 0)

            fout << i << " " << c[i] - na << endl;
    }
}