Cod sursa(job #1867469)

Utilizator delia_99Delia Draghici delia_99 Data 4 februarie 2017 09:50:26
Problema Cuplaj maxim in graf bipartit Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define NMAX 10000

using namespace std;

int n1,n2,m,sol,i;
int st[NMAX+5],dr[NMAX+5];
bool used[2*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+n1);
        G[b+n1].push_back(a);
    }

    for(i=1; i<=n1; ++i)
    {
        if(st[i])
            continue;
        if(cupleaza(i))
            ++sol;
        else
        {
            memset(used, 0, sizeof(used));
            if(cupleaza(i))
                ++sol;
        }
    }

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

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

    return 0;
}