Cod sursa(job #301350)

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

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], fol[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]) return 0;
     viz[nod] = 1;
     
     int len = G[nod].size();
     for (int i = 0; i < len; i++)
         if (!cuplaj[G[nod][i]]) {
             cuplaj[G[nod][i]] = nod; fol[nod] = 1;
             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; fol[nod] = 1;
            return 1;
         }
     
     return 0;    
}

int main() {

    cit();

    int ok = 1;
    
    while (ok) {
          ok = 0;
          
          memset(viz, 0, sizeof(viz));
          
          for (int i = 1; i <= n; i++)
              if (!fol[i] && cupleaza(i)) {
                 sol++;
                 ok = 1;
              }
    }
    
    printf("%d\n", sol);
    
    for (k = 1; k <= m; k++)
        if (cuplaj[k]) printf("%d %d\n", cuplaj[k], k);

    return 0;
}