Cod sursa(job #1644357)

Utilizator bluespideyMarin Diana bluespidey Data 9 martie 2016 22:41:33
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

vector<int> graf[100001];

int n,ma,e,m2[100001],m1[100001],i,ms,x,y,sch;
bool used[100001];

int m(int a)
{
    if(used[a])
        return 0;
    used[a] = 1;

    for(vector<int>::iterator it = graf[a].begin(); it!=graf[a].end(); ++it)
    {
        if(!m2[*it])
        {
            m1[a] = *it;
            m2[*it] = a;
            return 1;
        }
    }

    for(vector<int>::iterator it = graf[a].begin(); it != graf[a].end(); ++it)
    {
        if(m(m2[*it]))
        {
            m1[a] = *it;
            m2[*it] = a;
            return 1;
        }
    }

    return 0;
}

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

    for(i = 1; i <= e; ++i)
    {
        fin >> x >> y;
        graf[x].push_back(y);
    }

    sch = 1;

    while(sch)
    {
            sch = 0;
            memset(used,0,sizeof(used));

            for(i = 1; i <= n; ++i)
                if(!m1[i])
                    sch += m(i);
    }

    ms = 0;

    for(i = 1; i <= n; ++i)
        if(m1[i])
            ++ms;

    fout << ms << '\n';

    for(i = 1; i <= n; ++i)
        if(m1[i])
            {
                fout << i << " " << m1[i];
                fout << '\n';
            }


    return 0;
}