Cod sursa(job #1625240)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 2 martie 2016 17:45:40
Problema Cuplaj maxim in graf bipartit Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

#define DIM 10005

vector <vector <int> > Graph;
vector <int> cuplat;
int N, M, K, x, y, viz[DIM], deviz;

int DFS(int i);
void cupleaza(int a, int b);

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

    scanf("%d %d %d\n", &N, &M, &K);

    Graph.resize(N + M + 1);
    cuplat.resize(N + M + 1);

    for(int i = 1; i <= K; ++i) {
        scanf("%d %d\n", &x, &y);

        Graph[x].push_back(y + N);
        Graph[y + N].push_back(x);
    }

    int rez = 1;
    deviz = 0;

    while(rez) {
        rez = 0;
        ++deviz;
        for(int i = 1; i <= N + M; ++i) {
            if(cuplat[i] == 0 && viz[i] < deviz) {
                rez |= DFS(i);
            }
        }
    }

    int answer = 0;

    for(int i = 1; i <= N; ++i) {
        answer += (cuplat[i] != 0);
    }

    cout << answer << '\n';

    for(int i = 1; i <= N; ++i) {
        if(cuplat[i] != 0) {
            cout << i << ' ' << cuplat[i] - N << '\n';
        }
    }

    return 0;
}

int DFS(int i) {
    viz[i] = deviz;

    for(auto j: Graph[i]) {
        if(viz[j] < deviz) {
            viz[j] = deviz;
            if(cuplat[j]) {
                if(DFS(cuplat[j])) {
                    cupleaza(i, j);
                    return 1;
                }
            }
            else {
                cupleaza(i, j);
                return 1;
            }
        }
    }

    return 0;
}

void cupleaza(int a, int b) {
    cuplat[cuplat[a]] = 0;
    cuplat[a] = b;
    cuplat[cuplat[b]] = 0;
    cuplat[b] = a;
}