Cod sursa(job #1867484)

Utilizator delia_99Delia Draghici delia_99 Data 4 februarie 2017 10:04:26
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>
#include <vector>
#define NMAX 10000

using namespace std;

int n1,n2,m,sol,i;
int st[NMAX+5],dr[NMAX+5];
bool used[NMAX+5];
vector <int> G[NMAX+5];

bool cupleaza(int node)
{
    int i,s=G[node].size(),son;

    if(used[node])
        return 0;
    used[node]=1;

    for(i=0; i<s; ++i)
    {
        son=G[node][i];
        if(!dr[son] || cupleaza(dr[son]))
        {
            st[node]=son;
            dr[son]=node;
            return 1;
        }
    }
    return 0;
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);

    scanf("%d%d%d",&n1,&n2,&m);

    for(i=1; i<=m; ++i)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        G[a].push_back(b);
    }

    while(true)
    {
        bool ok=0;
        for(int j=1; j<=n1; ++j)
            used[j]=0;

        for(i=1; i<=n1; ++i)
        {
            if(st[i] || used[i])
                continue;
            if(cupleaza(i))
            {
                ok=1;
                ++sol;
            }
        }
        if(!ok)
            break;
    }

    printf("%d\n",sol);

    for(i=1; i<=n1; ++i)
        if(st[i])
            printf("%d %d\n",i,st[i]);

    return 0;
}