Cod sursa(job #1549586)

Utilizator netedu_andreiFII Andrei Netedu netedu_andrei Data 12 decembrie 2015 14:59:37
Problema Cuplaj maxim in graf bipartit Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <vector>
#define NMAX 10100

using namespace std;

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

vector<int> v[NMAX];
int n,m,l,viz[NMAX],c[NMAX],c2[NMAX];

bool dfs(int nod)
{
    if(viz[nod]) return 0;
    unsigned int i;
    viz[nod]=1;
    for(i=0; i<v[nod].size(); i++)
        if(c2[v[nod][i]] == 0)
        {
            c[nod] = v[nod][i];
            c2[v[nod][i]] = n;
            return 1;
        }
    for(i=0; i<v[nod].size(); i++)
        if(dfs(c2[v[nod][i]]))
        {
            c[nod] = v[nod][i];
            c2[v[nod][i]] = n;
            return 1;
        }
    return 0;
}

int main()
{
    int a,b,i;
    fin >> n >> m >> l;
    for(i=0; i<l; i++)
    {
        fin >> a >> b;
        v[a].push_back(b);
    }

    int ok = 1;
    while(ok)
    {
        ok=0;
        for(i=1; i<=n; i++)
            viz[i] = 0;
        for(i=1; i<=n; i++)
            if(c[i]==0) ok |= dfs(i);
    }

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

    fout << cpmax << '\n';

    for(i=1; i<=n; i++)
        if(c[i]!=0) fout << i << ' ' << c[i] << '\n';

    return 0;
}