Cod sursa(job #1668866)

Utilizator Burbon13Burbon13 Burbon13 Data 30 martie 2016 09:46:05
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

const int nmx = 10002;

int ns,nd,l,d[nmx],s[nmx];
bool viz[nmx];
vector <int> g[nmx];

void citire() {
    scanf("%d %d %d", &ns, &nd, &l);
    int nod1,nod2;
    for(int i = 1; i <= l; ++i) {
        scanf("%d %d", &nod1, &nod2);
        g[nod1].push_back(nod2);
    }
}

bool schimba(int i) {
    if(viz[i])
        return 0;
    viz[i] = 1;
    for(vector<int>::iterator it = g[i].begin(); it != g[i].end(); ++it)
        if(not d[*it]) {
            d[*it] = i;
            s[i] = *it;
            return 1;
        }
    for(vector<int>::iterator it = g[i].begin(); it != g[i].end(); ++it)
        if(schimba(d[*it])) {
            d[*it] = i;
            s[i] = *it;
            return 1;
        }
    return 0;
}

void rezolvare() {
    bool change = 1;
    while(change) {
        change = 0;
        memset(viz,0,sizeof(viz));
        for(int i = 1; i <= ns; ++i)
            if(not s[i])
                change |= schimba(i);
    }
}

void afish() {
    int sol = 0;
    for(int i = 1; i <= ns; ++i)
        if(s[i])
            ++ sol;
    printf("%d\n", sol);
    for(int i = 1; i <= ns; ++i)
        if(s[i])
            printf("%d %d\n", i, s[i]);
}

int main() {
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    citire();
    rezolvare();
    afish();
    return 0;
}