Cod sursa(job #1550197)

Utilizator VladCiofuCiofu Vlad VladCiofu Data 13 decembrie 2015 13:11:15
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <vector>

using namespace std;

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

#define MAX 20003

int n, na, m;
vector <int> viz, e, c;
vector <vector <int> > v;

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

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

    n += na;

    viz.resize(n+1);
    e.resize(n+1);
    c.resize(n+1);
    v.resize(n+1);

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

        fin >> x >> y;

        y += na;

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

        v[x].resize(e[x]+1);
        v[y].resize(e[y]+1);

        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;
    }
}