Cod sursa(job #1608750)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 22 februarie 2016 12:33:51
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<cstdio>
#include<vector>
#define NMAX 10023
using namespace std;
int n,m,e;
vector<int>con[NMAX];
int l[NMAX],r[NMAX],v[NMAX];
int connect(int nod)
{
    if(v[nod]) return 0;
    v[nod]=1;
    vector<int>::iterator it;
    for(it=con[nod].begin();it!=con[nod].end();++it)
    {
        if(r[*it]==0)
        {
            r[*it]=nod;
            l[nod]=*it;
            return 1;
        }
    }
    for(it=con[nod].begin();it!=con[nod].end();++it)
    {
        if(connect(r[*it]))
        {
            r[*it]=nod;
            l[nod]=*it;
            return 1;
        }
    }
    return 0;
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);

    scanf("%d %d %d",&n,&m,&e);
    int x,y;
    for(int i=1;i<=e;i++)
    {
        scanf("%d %d",&x,&y);
        con[x].push_back(y);
    }

    int next;
    while(1)
    {
        bool as=0;
        for(int i=1;i<=n;i++)
        {
            if(l[i]==0)
            {
                if(connect(i)) as=1;
            }
        }
        for(int i=1;i<=n;i++) v[i]=0;
        if(as==0) break;
    }
    int cup=0;
    for(int i=1;i<=n;i++) if(l[i]!=0) cup++;
    printf("%d\n",cup);
    for(int i=1;i<=n;i++) if(l[i]!=0) printf("%d %d\n",i,l[i]);
}