Cod sursa(job #1612906)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 25 februarie 2016 08:57:25
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

static bool repair(const int x, vector<bool>& use, const vector<vector<int>>& vec,
        vector<int>& dr, vector<int>& st){
    if(use[x]){
        return false;
    }
    use[x] = true;
    for(int i = 0; i < vec[x].size(); ++i){
        if(st[vec[x][i]] == -1){
            dr[x] = vec[x][i];
            st[vec[x][i]] = x;
            return true;
        }
    }
    for(int i = 0; i < vec[x].size(); ++i){
        if(repair(st[vec[x][i]], use, vec, dr, st)){
            dr[x] = vec[x][i];
            st[vec[x][i]] = x;
            return true;
        }
    }
    return false;
}

static void cuplaj(const int m, const vector<vector<int>>& vec, vector<int>& dr){
    const int n = vec.size();
    static vector<bool> use(n, false);
    static vector<int> st(m, -1);
    fill(dr.begin(), dr.end(), -1);

    for(bool changed = true; changed; ){
        changed = false;
        fill(use.begin(), use.end(), false);
        for(int i = 0; i < n; ++i){
            if(dr[i] == -1){
                changed = (repair(i, use, vec, dr, st) || changed);
            }
        }
    }
}

int main()
{
    ifstream f("cuplaj.in");
    ofstream g("cuplaj.out");
    int n, m, e;
    f >> n >> m >> e;

    static vector<vector<int>> vec(n);
    for(int i = 0, a, b; i < e; ++i){
        f >> a >> b;
        vec[a-1].push_back(b-1);
    }
    static vector<int> dr(n);
    cuplaj(m, vec, dr);

    int rez = n - count(dr.begin(), dr.end(), -1);
    g << rez << '\n';
    for(int i = 0; i < n; ++i){
        if(dr[i] != -1){
            g << i+1 << ' ' << dr[i]+1 << '\n';
        }
    }

    return 0;
}