Cod sursa(job #950225)

Utilizator mariacMaria Constantin mariac Data 16 mai 2013 10:53:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>
#include <string.h>
#define MAXN 10002

using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector<int> lv[MAXN];
int m1[MAXN], m2[MAXN];
bool v[MAXN];

int cuplaj(int nod)
{
    if( v[nod] ) return 0;
    v[nod] = 1;

    int i,x,l;
    l=lv[nod].size();
    for(i = 0; i < l; i++ )
    {
        x = lv[nod][i];
        if(!m2[x])
        {
                m2[x]=nod;
                m1[nod]=x;
                return 1;
        }
    }
     for(i = 0; i < l; i++ )
    {
        x = lv[nod][i];
        if(cuplaj(m2[x]))
        {
                m2[x]=nod;
                m1[nod]=x;
                return 1;
        }
    }
    return 0;



}

int main()
{
    int n, m, e;
    fin>>n>>m>>e;
    int i, x ,y;
    for(i=1;i<=e;i++)
    {
        fin>>x>>y;
        lv[x].push_back(y);
    }

    int ok=1;
    while(ok)
    {
        ok=0;
        for(i = 1; i <= n; i++)
            if(!m1[i] && cuplaj(i))ok = 1;
        memset(v,0,sizeof(v));
    }

    int nrc=0;
    for(i=1;i<=n;i++)
        if(m1[i]) nrc++;
    fout<<nrc<<"\n";
    for(i=1;i<=n;i++)
        if(m1[i])fout<<i<<" "<<m1[i]<<"\n";
    return 0;
}