Cod sursa(job #1437470)

Utilizator Vladut-Vlad Panait Vladut- Data 17 mai 2015 19:55:34
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <string.h>
#define maxn 10005

using namespace std;

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

int n, m, e, u, v, nr;
bool cuplat[maxn];
vector<int> G[maxn];
int L[maxn], R[maxn];

bool pair_up(int nod)
{
    if(cuplat[nod])
    {
        return 0;
    }
    cuplat[nod]=1;

    for(int i=0; i<G[nod].size(); i++)
    {
        int p=G[nod][i];
        if(!R[p])
        {
            L[nod]=p;
            R[p]=nod;
            return 1;
        }
    }
    for(int i=0; i<G[nod].size(); i++)
    {
        int p=G[nod][i];
        if(pair_up(R[p]))
        {
           L[nod]=p;
           R[p]=nod;
           return 1;
        }
    }

    return 0;
}

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

    while(e--)
    {
        fin >> u >> v;
        G[u].push_back(v);
    }
    bool stare=1;
    while(stare)
    {
        stare=0;
        for(int i=1; i<=n; i++)
        {
            cuplat[i]=0;
        }
        for(int i=1; i<=n; i++)
        {
            if(!L[i])
            {
                stare=stare|pair_up(i);
            }
        }
    }

    for(int i=1; i<=n; i++)
    {
        if(L[i]>0)
        {
            nr++;
        }
    }
    fout << nr << '\n';

    for(int i=1; i<=n; i++)
    {
        if(L[i]>0)
        {
            fout << i << ' ' << L[i] << '\n';
        }
    }

    return 0;
}