Cod sursa(job #1790397)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 28 octombrie 2016 10:31:45
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <vector>
#define NMAX 10023
#define pb push_back
using namespace std;
vector<int>adj[NMAX];
int n,m,p;
int l[NMAX],r[NMAX],vis[NMAX];
inline void citire()
{
    scanf("%d%d%d",&n,&m,&p);
    for(int i=1;i<=p;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        adj[a].pb(b);
    }
}
int pairup(int nod)
{
    if(vis[nod]) return 0;
    vis[nod]=1;
    vector<int>::iterator it;
    for(it=adj[nod].begin();it!=adj[nod].end();++it)
    {
        if(!r[*it])
        {
            l[nod]=*it;
            r[*it]=nod;
            return 1;
        }
    }
    for(it=adj[nod].begin();it!=adj[nod].end();++it)
    {
        if(pairup(r[*it]))
        {
            l[nod]=*it;
            r[*it]=nod;
            return 1;
        }
    }
    return 0;
}
inline void conectare()
{
    for(int c=1;c!=0;)
    {
        c=0;
        for(int i=1;i<=n;i++)
        {
            if(l[i]==0) c|=pairup(i);
        }
        for(int i=1;i<=n;i++) vis[i]=0;
    }
}
inline void afisare()
{
    int ct=0;
    for(int i=1;i<=n;i++) if(l[i]!=0) ++ct;
    printf("%d\n",ct);
    for(int i=1;i<=n;i++) if(l[i]!=0) printf("%d %d\n",i,l[i]);
}
int main()
{
    freopen ("cuplaj.in","r",stdin);
    freopen ("cuplaj.out","w",stdout);
    citire();
    conectare();
    afisare();
}