Cod sursa(job #1567920)

Utilizator serbanSlincu Serban serban Data 13 ianuarie 2016 20:18:26
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
#define NR 10005

using namespace std;

vector<int> V[NR];
int perA[NR];
int perB[NR];
bool viz[NR];

bool dfs(int node) {
    viz[node] = true;
    for(int i = 0; i < V[node].size(); i ++) {
        int now = V[node][i];
        if(!perB[now]) {
            perA[node] = now;
            perB[now] = node;
            return true;
        }
    }
    for(int i = 0; i < V[node].size(); i ++) {
        int now = V[node][i];
        if(!viz[perB[now]] && dfs(perB[now])) {
            perA[node] = now;
            perB[now] = node;
            return true;
        }
    }
    return false;
}

int main()
{
    ifstream d("cuplaj.in");
    ofstream g("cuplaj.out");
    int n, m, E, x, y; d >> n >> m >> E;
    for(int i = 1; i <= E; i ++) {
        d >> x >> y;
        V[x].push_back(y);
    }

    int k = 0;
    for(int i = 1; i <= n; i ++) {
        if(!perA[i]) {
            if(dfs(i)) k ++;
            memset(viz, false, n);
        }
    }

    g << k << "\n";
    for(int i = 1; i <= n; i ++)
        if(perA[i]) g << i << " " << perA[i] << "\n";
    return 0;
}