Cod sursa(job #343599)

Utilizator freak93Adrian Budau freak93 Data 26 august 2009 15:13:06
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>
#include<vector>
#include<cstring>

using namespace std;

const int maxn=10005;
const char iname[]="cuplaj.in";
const char oname[]="cuplaj.out";

ifstream f(iname);
ofstream g(oname);

vector<int> A[maxn];

int i,l[maxn],r[maxn],n,m,e;

bool passed[maxn];

bool go(int x)
{
    if(passed[x])
        return false;
    passed[x]=1;

    for(vector<int>::iterator it=A[x].begin();it!=A[x].end();++it)
        if(!r[*it])
        {
            r[*it]=x;
            l[x]=*it;
            return 1;
        }

    for(vector<int>::iterator it=A[x].begin();it!=A[x].end();++it)
        if(go(r[*it]))
        {
            r[*it]=x;
            l[x]=*it;
            return 1;
        }

    return 0;
}

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

    int x,y;

    for(i=1;i<=e;++i)
    {
        f>>x>>y;
        A[x].push_back(y);
    }

    int ok=1;
    while(ok)
    {
        ok=0;
        memset(passed,false,sizeof(passed));
        for(i=1;i<=n;++i)
            if(!l[i])
                ok|=go(i);
    }

    int many=0;
    for(i=1;i<=n;++i)
        many+=(l[i]>0);
    g<<many<<"\n";
    for(i=1;i<=n;++i)
        if(l[i])
            g<<i<<" "<<l[i]<<"\n";

    f.close();
    g.close();

    return 0;
}