Cod sursa(job #1549398)

Utilizator andreas.chelsauAndreas Chelsau andreas.chelsau Data 12 decembrie 2015 12:01:43
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int MAX = 10005;
vector <int> g[MAX];
int st[MAX], dr[MAX],vis[MAX],c[2*MAX];

int dfs(int i) {
	int k;
	for (int j = 0; j < g[i].size(); j++) {
		k = g[i][j];
		if (vis[k] || c[k] == 1) 
			continue;
		if (c[k] == -1) {
			vis[k] = 1;
			c[i] = k;
			return 1;
		}
		else {
			vis[k] = 1;
			if (dfs(c[k])) {
				c[i] = k;
				c[k] = i;
				return 1;
			}
			else
				continue;
		}
	}
	return 0;


}


int main() {
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);
	memset(c, -1, sizeof(c));
	int n, m, e, nr = 0;
	cin >> n >> m >> e;
	for (int i = 1; i <= e; i++) {
		int a, b;
		cin >> a >> b;
		g[a].push_back(b);
	}
	int ok = 1;
	while (ok) {
		ok = false;
		memset(vis, 0, sizeof(vis));
		for (int i = 1; i <= n; i++)
			if (c[i] == -1 && dfs(i)) 
				ok = true;
	}	
	for (int i = 1; i <= n; i++)
		if (c[i] != -1) 
			nr++;
	cout << nr << "\n";
	for (int i = 1; i <= n; i++)
		if (c[i] != -1) 
			cout << i << " " << c[i] << "\n";


	return 0;
}