Cod sursa(job #1914304)

Utilizator dumitrescugeorgeGeorge Dumitrescu dumitrescugeorge Data 8 martie 2017 16:24:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector <int> G[20000];
int viz[100000],x,y,n,m,e,dr[100000],st[10000];
void refill()
{
    for(int i=0;i<=n;i++)
        viz[i]=0;
}
int cuplaj(int i)
{
    if(viz[i]!=0) return 0;
    viz[i]=1;
    vector <int>::iterator it;
    for(it=G[i].begin();it<G[i].end();it++)
    {
        if(!dr[*it])
        {
            st[i]=*it;
            dr[*it]=i;
            return 1;
        }
    }
    for(it=G[i].begin();it<G[i].end();it++)
    {
        if(cuplaj(dr[*it]))
        {
            st[i]=*it;
            dr[*it]=i;
            return 1;
        }
    }
    return 0;
}
void citire()
{
    scanf("%d%d%d",&n,&m,&e);
    for(int i=1;i<=e;i++)
    {
        scanf("%d%d",&x,&y);
        G[x].push_back(y);
    }
}
void cerinta()
{
    int ok=1;
    citire();
    while(ok!=0)
    {
        ok=0;
        refill();
        for(int i=1;i<=n;i++)
            if(st[i]==0)
                ok+=cuplaj(i);
    }
    int nr=0;
    for(int i=1;i<=n;i++)
        if(st[i]!=0)
            nr++;
    printf("%d\n",nr);
    for(int i=1;i<=n;i++)
        if(st[i]!=0)
    {
        printf("%d %d\n",i,st[i]);
    }
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    cerinta();
   // cout << "Hello world!" << endl;
    return 0;
}