Cod sursa(job #1832626)

Utilizator grimmerFlorescu Luca grimmer Data 20 decembrie 2016 17:12:54
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

const int NMax = 10000;
vector<int> G[NMax + 5];
int l[NMax + 5], r[NMax + 5], n, m, e;
bool viz[NMax + 5];

bool CPL(int node){
	int i, curr_node;
	viz[node] = true;

	for(i = 0; i < (int)G[node].size(); ++i){
		curr_node = G[node][i];

		if(r[curr_node] == 0){
			l[node] = curr_node;
			r[curr_node] = node;
			return 1;
		}
	}

	for(i = 0; i < (int)G[node].size(); ++i){
		curr_node = G[node][i];

		if(viz[r[curr_node]] == false && CPL(r[curr_node])){
			l[node] = curr_node;
			r[curr_node] = node;
			return 1;
		}

	}

	return 0;
}

int main()
{
	int i, x, y, cnt = 0;
	bool ok = true;

	fin>> n >> m >> e;

	for(i = 1; i <= e; ++i){
		fin>> x >> y;
		G[x].push_back(y);
	}

    while(ok){
		ok = false;
		memset(viz, 0, sizeof viz);

		for(i = 1; i <= n; ++i){
			if(l[i] == 0 && CPL(i)){
				ok = true;
				++cnt;
			}
		}
    }


    fout<< cnt << "\n";

    for(i = 1; i <= n; ++i){
		if(l[i] != 0){
			fout<< i << " " << l[i] << "\n";
		}
    }

    return 0;
}