Cod sursa(job #963827)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 19 iunie 2013 16:00:05
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>

const static int maxn = 10073;

using namespace std;

vector <int> graf[maxn];
int n,m,e;

int l[maxn], r[maxn];
bool sel[maxn];

bool cupleaza(int x)
{
    int i;
    if (sel[x]) return 0;
    sel[x] = true;
    for (i=0; i<graf[x].size(); i++)
        if (!r[graf[x][i]])
        {
            l[x] = graf[x][i];
            r[graf[x][i]] = x;
            return 1;
        }

    for (i=0; i < graf[x].size(); i++)
        if (cupleaza(r[graf[x][i]]) )
        {
            l[x] = graf[x][i];
            r[graf[x][i]] = x;
            return 1;
        }
    return 0;
}
int main()
{

    int x,y;
    ifstream in("cuplaj.in");
    in>>n>>m>>e;

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

    for (int i=1;i<=n;i++)
    {
        if (l[i] == 0)
        {
            if (!cupleaza(i))
            {
                fill(sel,sel+n+1,false);
                cuplaj+=cupleaza(i);
            }
            else
            {
                cuplaj++;
            }
        }
    }

    ofstream out("cuplaj.out");

    out<<cuplaj<<"\n";
    for(int i=1;i<=n;i++)
        if (l[i] != 0)
            out<<i<<" "<<l[i]<<"\n";
    return 0;
}