Cod sursa(job #1188907)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 20 mai 2014 19:31:44
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define N 10010
using namespace std;
vector <int>v[N];
bool V[N];
int n,m,e,S[N],D[N],i,C,x,y;
bool creste(int nod)
{
    if(V[nod])
        return 0;
    V[nod]=1;
    vector<int>::iterator it;
    for(it=v[nod].begin();it!=v[nod].end();it++)
        if(!S[*it])
        {
            S[*it]=nod;
            D[nod]=*it;
            return 1;
        }
    for(it=v[nod].begin();it!=v[nod].end();it++)
        if(creste(S[*it]))
        {
            S[*it]=nod;
            D[nod]=*it;
            return 1;
        }
    return 0;
}
inline bool OK()
{
    int ret=0;
    memset(V,0,sizeof(V));
    for(i=1;i<=n;i++)
        if(!D[i]&&creste(i))
        {
            C++;
            ret=1;
        }
    return ret;
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&n,&m,&e);
    for(i=1;i<=e;i++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
    }
    while(OK());
    printf("%d\n",C);
    for(i=1;i<=n;i++)
        if(D[i])
            printf("%d %d\n",i,D[i]);
    return 0;
}