Cod sursa(job #1014111)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 22 octombrie 2013 08:55:05
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
unsigned l[10005],r[10005],n,m,e;
bool viz[10005];
using namespace std;
vector <unsigned> da[10005];
unsigned cup(unsigned u)
{
    unsigned i,a;
    if(viz[u]==1)
    return 0;
    viz[u]=1;
    a=da[u].size();
    for(i=0;i<a;i++)
    if(r[da[u][i]]==0)
    {
    l[u]=da[u][i];
    r[da[u][i]]=u;
    return 1;
    }
    for(i=0;i<a;i++)
    if(cup(r[da[u][i]]))
    {
        l[u]=da[u][i];
        r[da[u][i]]=u;
        return 1;
    }
    return 0;
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%u%u%u",&n,&m,&e);
    unsigned i,x,y;
    bool t=1;
    for(i=1;i<=e;i++)
    {
        scanf("%u%u",&x,&y);
        da[x].push_back(y);
    }
    while(t==1)
    {t=0;
        for(i=1;i<=n;i++)
        viz[i]=0;
        for(i=1;i<=n;i++)
        if(l[i]==0 && cup(i)!=0)
        t=1;
    }
    x=0;
    for(i=1;i<=n;i++)
    if(l[i]>0)
    x++;
printf("%u\n",x);
for(i=1;i<=n;i++)
if(l[i]!=0)
printf("%u %u\n",i,l[i]);
    return 0;
}