Cod sursa(job #418892)

Utilizator vladiiIonescu Vlad vladii Data 16 martie 2010 17:29:10
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int N, M, E;
int R[10001], L[10001];
bool U[10001];
vector<int> G[100001];

int pairUp(int nod) {
    if(U[nod]) return 0;
    U[nod]=1;
    for(vector<int>::iterator it=G[nod].begin(); it!=G[nod].end(); it++) {
         if(!R[(*it)]) {
              L[nod]=(*it);
              R[(*it)]=nod;
              return 1;
         }
    }
    for(vector<int>::iterator it=G[nod].begin(); it!=G[nod].end(); it++) {
         if(pairUp(R[*it])) {
              L[nod]=(*it);
              R[(*it)]=nod;
              return 1;
         }
    }  
    return 0;
}

int main() {
    fstream f1, f2;
    int i, j, p, q, ok=1;
    f1.open("cuplaj.in", ios::in);
    f1>>N>>M>>E;
    for(i=1; i<=E; i++) {
         f1>>p>>q;
         G[p].push_back(q);
    }
    f1.close();
    while(ok) {
         ok=0;
         memset(U, 0, sizeof(U));
         for(i=1; i<=N; i++) {
              if(!L[i]) {
                   if(pairUp(i)) {
                        ok=1;
                   }
              }
         }
    }
    int c=0;
    for(i=1; i<=N; i++) {
         if(L[i]) { c++; }
    }
    f2.open("cuplaj.out", ios::out);
    f2<<c<<endl;
    for(i=1; i<=N; i++) {
         if(L[i]) { f2<<i<<" "<<L[i]<<endl; }
    }
    f2.close();
    return 0;
}