Cod sursa(job #1549406)

Utilizator andreas.chelsauAndreas Chelsau andreas.chelsau Data 12 decembrie 2015 12:11:36
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 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 k){
	vis[k] = 1;

	for (int i = 0; i<g[k].size(); ++i){
		if (vis[g[k][i]] || c[k] == g[k][i]) 
			continue;

		if (c[g[k][i]] == -1) {
			c[k] = g[k][i];
			c[g[k][i]] = k;
			vis[g[k][i]] = 1;
			return 1;
		}
		else {
			vis[g[k][i]] = 1;
			if (dfs(c[g[k][i]])) {
				c[k] = g[k][i];
				c[g[k][i]] = k;
				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);
		g[b].push_back(a);
	}
	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;
}