Cod sursa(job #1437905)

Utilizator CalinCojoFMI Cojocaru Calin George CalinCojo Data 18 mai 2015 19:50:43
Problema Cuplaj maxim in graf bipartit Scor 56
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb


#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

const int MAX = 10003;

int N, M, P, sol, k, cuplaj [MAX], viz[MAX] , used[ MAX ];
vector <int> vcn [ MAX ];

bool cuplz ( int nd ) {
    if ( viz [nd] == k ) return 0;
    viz[nd] = k;
    int i;

    for ( i = 0 ; i < vcn[nd].size() ; i++ )
      if (!cuplaj[vcn[nd][i]]) {
       cuplaj[vcn[nd][i]] = nd; used[nd] = 1;
       return 1;
   }


    for ( i = 0 ; i < vcn[nd].size() ; i++ )
        if ( cuplaj [vcn[nd][i]] != nd && cuplz ( cuplaj [vcn[nd][i]] ) ){
            cuplaj [vcn[nd][i]] = nd;
            return 1;
        }
      return 0;
}


int main() {
    ifstream f ( "cuplaj.in" , ios::in ) ;
    ofstream g ( "cuplaj.out" , ios::out );

    int i , x, y, z = 1;
    f >> N >> M >> P;
    while ( P-- ) {
        f >> x >> y;
        vcn[x].push_back ( y );
    }
    while ( z ) {
        z = 0;
        k++;
        for ( i = 1; i <= N ; i++ )
            if ( !used [i] && cuplz ( i ) ) {
                z=1;
                sol++;
            }

    }
   g<<sol<<"\n";
   for ( i = 1; i <= M ; i++)
         if ( cuplaj [i] ) g<<cuplaj[i]<<" "<<i<<"\n";
    return 0;
}