Cod sursa(job #2469664)

Utilizator Leonard1998Olariu Leonard Leonard1998 Data 7 octombrie 2019 20:23:29
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>
#define MAXN (int)(1e4 + 5)

using namespace std;

int N, M, edgeCount; //N - left size, M - right size
vector<int> G[MAXN];
int rightPair[MAXN], leftPair[MAXN], visited[MAXN];

int pairUp(int currNode) {
    visited[currNode] = 1;

    for (int rightNode : G[currNode])
        if (!leftPair[rightNode]) {
            rightPair[currNode] = rightNode;
            leftPair[rightNode] = currNode;
            return 1;
        }

    for (int rightNode : G[currNode])
        if (!visited[leftPair[rightNode]] && pairUp(leftPair[rightNode])) {
            rightPair[currNode] = rightNode;
            leftPair[rightNode] = currNode;
            return 1;
        }

    return 0;
}

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

    scanf("%d %d %d", &N, &M, &edgeCount);

    int x, y;
    for (int i = 1; i <= edgeCount; ++i) {
        scanf("%d %d", &x, &y);
        G[x].push_back(y);
    }

    for (int change = 1; change;) {
        change = 0;
        memset(visited, 0, sizeof(visited));
        for (int i = 1; i <= N; ++i)
            if (!rightPair[i]) change |= pairUp(i);
    }

    int cuplaj = 0;
    for (int i = 1; i <= N; ++i)
        if (rightPair[i]) cuplaj += (rightPair[i] > 0);
    printf("%d\n", cuplaj);

    for (int i = 1; i <= N; ++i)
        if (rightPair[i]) printf("%d %d\n", i, rightPair[i]);

    return 0;
}