Cod sursa(job #953935)

Utilizator mihai10stoicaFMI - Stoica Mihai mihai10stoica Data 27 mai 2013 20:31:21
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define MAXN  10005
vector <int> G[MAXN];
int l[MAXN],r[MAXN],u[MAXN];
int pairup(const int n)
{
    if(u[n])  return 0;
    u[n]=1;
    vector <int>::iterator i;
    for(i=G[n].begin();i!= G[n].end();i++)
        if(!r[*i])
        {
            l[n]=*i;
            r[*i] = n;
            return 1;
        }
    for(i=G[n].begin();i!=G[n].end();i++)
        if(pairup(r[*i]))
        {
            l[n]=*i;
            r[*i]=n;
            return 1;
        }
    return 0;
}
int main()
{
    ifstream in("cuplaj.in");
    ofstream out("cuplaj.out");
    int n,m,nr,x,y,sem,i;
    in>>n>>m>>nr;
    while(nr--)
    {
        in>>x>>y;
        G[x].push_back(y);
    }
    sem=1;
    while(sem)
    {
        sem=0;
        memset(u,0,sizeof(u));
        for(i=1;i<=n;i++)
            if(!l[i])
                sem=sem|pairup(i);
    }
    int cuplaj=0;
    for(i=1;i<=n;i++)  cuplaj+=(l[i]>0);
    out<<cuplaj<<"\n";
    for(i=1;i<=n;i++)
        if(l[i]>0)
            out<<i<<" "<<l[i]<<"\n";
    return 0;
}