Cod sursa(job #301329)

Utilizator savimSerban Andrei Stan savim Data 8 aprilie 2009 09:41:56
Problema Cuplaj maxim in graf bipartit Scor 32
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define MAX_N 10010

int n, m, e, sol, k;
vector <int> G[MAX_N];
int cuplaj[MAX_N], viz[MAX_N];

void cit() {
     freopen("cuplaj.in", "r", stdin);
     freopen("cuplaj.out", "w", stdout);
     
     scanf("%d %d %d", &n, &m, &e);     
     for (int i = 1; i <= e; i++) {
         int p, q;
         scanf("%d %d", &p, &q);
         G[p].push_back(q);
     }
}

int cupleaza(int nod) {
     if (viz[nod] == k) return 0;
     viz[nod] = k;
     
     int len = G[nod].size();
     for (int i = 0; i < len; i++)
         if (!cuplaj[G[nod][i]]) {
             cuplaj[G[nod][i]] = nod;
             return 1;
         }
     
     for (int i = 0; i < len; i++) 
         if (cuplaj[G[nod][i]] != nod && cupleaza(cuplaj[G[nod][i]])) {
            cuplaj[G[nod][i]] = nod;
            return 1;
         }
     
     return 0;    
}

int main() {

    cit();
    for (k = 1; k <= n; k++)
        sol += cupleaza(k);

    printf("%d\n", sol);
    
    for (k = 1; k <= n; k++)
        if (cuplaj[k]) printf("%d %d\n", k, cuplaj[k]);

    return 0;
}