Cod sursa(job #963847)

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

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]] == 0)
        {
            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;
    bool ok;
    while(ok)
    {
        ok=false;
        fill(sel , sel+n+1,false);
        for(int i=1;i<=n;++i)
        {
            if(l[i] == 0)
                if(cupleaza(i))
                    ok = true;
        }
    }

    for(int i=1;i<=n;++i)
        if(l[i] != 0) 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;
}