Cod sursa(job #767968)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 15 iulie 2012 16:38:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<cstdio>
#include<vector>
#define nmax 10010
using namespace std;
int n,m,e;
vector<int>v[nmax];
int vs[nmax],vd[nmax],viz[nmax];
void read(),solve();
int cupleaza(int);
int main()
{
    read();
    solve();
    return 0;
}
void read()
{
    int x,y;
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d", &n, &m, &e);
    for(;e;e--)
    {
        scanf("%d%d", &x, &y);
        v[x].push_back(y);
    }
}
void solve()
{
    int nr=0,ok=1,i;
    for(;ok;)
    {
        for(i=1;i<=n;i++)
            viz[i]=0;
        ok=0;
        for(i=1;i<=n;i++)
            if(!vs[i])
                if(cupleaza(i))
                    ok=1;
    }
    for(i=1;i<=n;i++)
        if(vs[i])
            nr++;
    printf("%d\n", nr);
    for(i=1;i<=n;i++)
        if(vs[i])
            printf("%d %d\n", i, vs[i]);
}
int cupleaza(int x)
{
    if(viz[x])return 0;
    viz[x]=1;
    for(vector<int>::iterator it=v[x].begin();it!=v[x].end();it++)
        if(!vd[*it])
        {
            vs[x]=*it;
            vd[*it]=x;
            return 1;
        }
    for(vector<int>::iterator it=v[x].begin();it!=v[x].end();it++)
        if(cupleaza(vd[*it]))
        {
            vs[x]=*it;
            vd[*it]=x;
            return 1;
        }
    return 0;
}