Cod sursa(job #1247844)

Utilizator smaraldaSmaranda Dinu smaralda Data 24 octombrie 2014 10:04:54
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;

const int NMAX = 10005;

bool vis[NMAX];
vector <int> graph[NMAX];
int pereche[NMAX];

int pair_up (int node) {
    if(vis[node])
        return 0;

    vis[node] = 1;
    for(vector <int>::iterator it = graph[node].begin(); it != graph[node].end(); ++ it)
        if(!pereche[*it] || pair_up(pereche[*it])) {
            pereche[*it] = node;
            return 1;
        }
    return 0;
}

int main() {
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    int i, n, m, e, x, y, ans;

    scanf("%d%d%d", &n, &m, &e);
    for(i = 1; i <= e; ++ i) {
        scanf("%d%d", &x, &y);
        graph[x].push_back(y);
        graph[y].push_back(x);
    }

    for(i = 1; i <= n; ++ i) {
        memset(vis, 0, sizeof(vis));
        pair_up(i);
    }
    
    ans = 0;
    for(i = 1; i <= m; ++ i)
        if(pereche[i])
            ++ ans;
    printf("%d\n", ans);
    for(i = 1; i <= m; ++ i)
        if(pereche[i])
            printf("%d %d\n", pereche[i], i);
    return 0;
}