Cod sursa(job #2797511)

Utilizator gruhtenZinnenberg Gruhten gruhten Data 10 noiembrie 2021 01:25:31
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include<cstdio>
#include<bitset>
#include<vector>
const int Nmax=10004;
const int DIM=1000004;
using namespace std;
vector<int> G[Nmax];
int used[Nmax];
int N,M,K,sef[Nmax],w[Nmax];
char c[DIM];
int pz = DIM-1;

void cit(int &x)
{
    x = 0;
    while('0' > c[pz] || c[pz] > '9')
        if(++pz == DIM)
            fread(c,1,DIM,stdin),pz = 0;

    while('0' <= c[pz] && c[pz] <= '9')
    {
        x = x * 10 + c[pz] - 48;
        if(++pz == DIM)
            fread(c,1,DIM,stdin),pz = 0;
    }
}

void read()
{
    cit(N);cit(M);cit(K);
    int a,b;
    for(int i = 1; i <= K; ++i)
    {
        cit(a);cit(b);
        G[b].push_back(a);
    }
}

bool cuplaj(int k)
{
    if(used[k] == 1)
        return false;

    used[k] = 1;

    for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
        if(w[*it]==0)
        {
            sef[k] = *it;
            w[*it] = k;
            return true;
        }
    for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
        if(cuplaj(w[*it]))
        {
            sef[k] = *it;
            w[*it] = k;
            return true;
        }
    return false;
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    read();
    int ok = 1,cnt = 0;
    while(ok)
    {
        ok = 0;
        for(int i=1;i<=M;++i)
            used[i]=0;

        for(int i = 1; i <= M; ++i)
            if(sef[i]==0)
             if(cuplaj(i))
             {
                ok = 1;
                ++cnt;
             }
    }

    printf("%d\n",cnt);
    for(int i = 1; i <= N; ++i)
        if(w[i])
            printf("%d %d\n",i,w[i]);
    return 0;
}