Cod sursa(job #393707)

Utilizator hasegandaniHasegan Daniel hasegandani Data 9 februarie 2010 20:45:14
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<stdio.h>
#include<vector>
#include <algorithm>

#define Nmax 10010
 
using namespace std;

vector <int> l[Nmax];

int viz[Nmax],leg[Nmax],p[Nmax],n,m,nr_edg,cuplaj;

void cit();
void solve();

int pairup(const int k)
{
    if (viz[k])
        return 0;
    viz[k]=1;
    
    for(vector<int>::iterator i=l[k].begin(); i!= l[k].end() ; ++i)
        if (!p[ *i ])
            {
            leg[k]= *i;
            p[ *i ]=k;
            return 1;
            }
            
    for(vector<int>::iterator i=l[k].begin(); i!= l[k].end() ;++i)
        if (p[*i]!=k && pairup(p[ *i ]))
            {
            leg[k]= *i;
            p[ *i ]=k;
            return 1;
            }
    return 0;
}

int main()
{
    cit();
    solve();
    return 0;
}

void solve()
{
    int ok=1;
    while (ok)
        {
            ok=0;
            memset(viz,0,Nmax);
            for(int i=1;i<=n;++i)
                if (!leg[i] && pairup(i))
                    {
                    ok =1;
                    ++cuplaj;
                    }
        }
        
    printf("%d\n",cuplaj);
    for(int i=1;i<=m;++i)
        if (p[i])
            printf("%d %d\n",p[i],i);
}

void cit()
{
    int x,y;
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&n,&m,&nr_edg);
    for(int i=1;i<=nr_edg;++i)
        {
        scanf("%d%d",&x,&y);
        l[x].push_back(y);
        }
}