Cod sursa(job #1549382)

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

int dfs(int i) {
	int s;
	if (vis[i]) 
		return false;
	vis[i] = true;
	for (int j = 0; j < g[i].size(); j++) {
		s = g[i][j];
		if (dr[s] == 0) {
			st[i] = s;
			dr[s] = i;
			return true;
		}
		if (dfs(dr[s])) {
			st[i] = s;
			dr[s] = i;
			return true;
		}
	}
	return false;
}

int main() {
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);

	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 (st[i] == 0 && dfs(i)) 
				ok = true;
	}	
	for (int i = 1; i <= n; i++)
		if (st[i]) 
			nr++;
	cout << nr << "\n";
	for (int i = 1; i <= n; i++)
		if (st[i]) 
			cout << i << " " << st[i] << "\n";


	return 0;
}










/*#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MAX = 10004;
vector<int> g[MAX];
int e[MAX * 2],n,m,E,v[MAX * 2][MAX * 2],vis[2 * MAX],c[2 * MAX],dr[MAX],st[MAX];


/*
int dfs(int i) {
	vis[i] = 1;
	for (int j = 1; j <= e[i]; j++) {
		int k = v[i][j];
		if (vis[k] || c[k] == i)
			continue;
		if (c[k] == -1) {
			vis[k] = 1;
			c[i] = k;
			return 1;
		}
		else {
			vis[k] = 1;
			if (dfs(c[k])) {
				c[k] = i;
				c[i] = k;
				return 1;
			}
			else
				continue;
		}
		
		

	}
	return 0;

	}*/	/*
bool dfs(int x) {

		int i, son;
		if (vis[x]) return false;
		vis[x] = true;
		for (i = 0; i<g[x].size(); i++) {
			son = g[x][i];
			if (dr[son] == 0) {
				st[x] = son;
				dr[son] = x;
				return true;
			}
			if (dfs(dr[son])) {
				st[x] = son;
				dr[son] = x;
				return true;
			}
		}
		return false;
}

/**/
/*
int main() {
	freopen("cuplaj.in", "r", stdin);
//	freopen("cuplaj.out", "w", stdout);
	memset(c, -1, sizeof(c));
	cin >> n >> m >> E;

	for (int i = 0; i < E; i++) {
		int a, b;
		cin >> a >> b;
		g[a].push_back(b);
	}
	int ok = 1;
	while (ok) {
		ok = 0;
		memset(vis, 0, sizeof(vis));
		for (int i = 1; i <= n; i++)
		if (vis[i] && st[i] == 0) {
			if (dfs(i))
				ok = 1;

		}
	}
	int nr = 0;
	for (int i = 1; i <= n; i++)
		if (st[i]) 
			nr++;
	printf("%d\n", nr);
	for (int i = 1; i <= n; i++)
		if (st[i])
		printf("%d %d\n", i, st[i]);


	return 0;
}*/