Cod sursa(job #1051699)

Utilizator OwlreeRobert Badea Owlree Data 10 decembrie 2013 14:05:39
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
//
//  main.cpp
//  cuplaj
//
//  Created by Robert Badea on 12/10/13.
//  Copyright (c) 2013 Robert Badea. All rights reserved.
//

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

using namespace std;

vector< vector<int> > graph;
vector<int> left_to_right;
vector<int> right_to_left;
vector<bool> used;

bool pairup(int v)
{
    if (used[v])
    {
        return false;
    }
    used[v] = true;
    for (int i = 0; i < graph[v].size(); ++i)
    {
        int u = graph[v][i];
        if (right_to_left[u] == 0)
        {
            left_to_right[v] = u;
            right_to_left[u] = v;
            return true;
        }
    }
    for (int i = 0; i < graph[v].size(); ++i)
    {
        int u = graph[v][i];
        if (pairup(right_to_left[u]))
        {
            left_to_right[v] = u;
            right_to_left[u] = v;
            return true;
        }
    }
    return false;
}

int main()
{
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
    
    int N, M, E;
    
    fin >> N >> M >> E;
    
    graph.resize(N + 1);
    left_to_right.resize(N + 1);
    right_to_left.resize(M + 1);
    used.resize(N + 1);
    
    for (int i = 0; i < E; ++i)
    {
        int a, b;
        fin >> a >> b;
        graph[a].push_back(b);
    }
    
    bool there_is_something_to_do = true;
    
    while (there_is_something_to_do)
    {
        there_is_something_to_do = false;
        for (int i = 0; i <= N; ++i)
        {
            used[i] = false;
        }
        for (int i = 1; i <= N; ++i)
        {
            if (left_to_right[i] == 0)
            {
                there_is_something_to_do = pairup(i) || there_is_something_to_do;
            }
        }
    }
    
    int size = 0;
    for (int i = 1; i <= N; ++i)
        size += (left_to_right[i] != 0);
    
    fout << size << "\n";
    
    for (int i = 1; i <= N; ++i)
    {
        if (left_to_right[i] != 0)
        {
            fout << i << " " << left_to_right[i] << "\n";
        }
    }
    
    fin.close();
    fout.close();
    
    return 0;
}