Cod sursa(job #1274047)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 23 noiembrie 2014 10:54:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>
#include <vector>
#define nmax 10010
#include <queue>
#include <cstring>

using namespace std;

vector < int > graph[nmax];
int n,m,e,sum;
queue < int > q;
int pair1[nmax],pair2[nmax];
bool u[nmax];

void read(){
    int x,y;
    scanf("%d %d %d ",&n ,&m ,&e );
    while(e--){
        scanf("%d %d ",&x,&y);
        graph[x].push_back(y);
    }
}

bool link(int k){
    if(u[k])
        return false;
    u[k] = true;
    for(vector < int > :: iterator it = graph[k].begin() ; it != graph[k].end() ; ++it){
        if(!pair2[*it]){
            pair1[k] = *it;
            pair2[*it] = k;
            return 1;
        }
    }
    for(vector < int > :: iterator it = graph[k].begin() ; it != graph[k].end() ; ++it){
        if(link(pair2[*it])){
            pair1[k] = *it;
            pair2[*it] = k;
            return 1;
        }
    }
    return 0;
}

void hopcraft_karp(){
    bool k = 1;
    int i;
    while(k){
        k = 0;
        memset(u,0,sizeof(u));
        for( i = 1 ; i <= n ; ++i){
            if(!pair1[i]){
                k |= link(i);
            }
        }
    }
    for( i = 1 ; i <= n;++i){
        if(pair1[i])sum++;
    }
    printf("%d\n",sum);
    for( i = 1; i <= n ; i++)if(pair1[i])printf("%d %d\n",i,pair1[i]);
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    read();
    hopcraft_karp();

    return 0;
}