Cod sursa(job #1549435)

Utilizator moscugeorgeMoscu George moscugeorge Data 12 decembrie 2015 12:28:51
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
using namespace std;

#define N 10000

int l[N],// l[i] = numarul de vecini al lui i
v[N][N],// al j-lea vecin al lui i
nb,// Numarul de noduri din dreapta
na, // numarul de noduri din stanga
c[N] = {-1}, //c[i] = -1 daca i nu este cuplat / c[i]=j daca i este cuplat
viz[N];

int dfs(int i){
	viz[i] = 1;
	for (int j = 1; j <= l[i]; ++j){
		int k = v[i][j];
		if (viz[k] || c[i] == k) continue;
		viz[k] = 1;

		if (c[k] == -1){
			c[k] = i;
			c[i] = k;
			return 1;
		}
		if (dfs(c[k])){
			c[i] = k;
			c[k] = i;
			return 1;
		}
		else continue;
	}
	return 0;
}


int main(){
	ifstream f("cuplaj.in");
	int e, x, y, j;
	f >> na >> nb >> e;
	for (int i = 1; i <= na + nb; i++){
		c[i] = -1;
	}
	for (int i = 1; i <= e; i++){
		f >> x >> y;
		
		l[x]++;
		l[y + na]++;

		v[x][l[x]] = y + na;
		v[y + na][l[y + na]] = x;
		/*
		c[x] = y + na;
		c[y + na] = x;*/
	}
	f.close();


	int ok = 1;

	while (ok){
		ok = 0;
		for (int i = 1; i <= na + nb; i++){
			viz[i] = 0;
		}
		for (int i = 1; i <= na; i++){
			if (!viz[i] && c[i]==-1)
				if (dfs(i)) ok = 1;
		}
	}
	ofstream g("cuplaj.out");
	int k = 0;
	for (int i = 1; i <= na; i++){
		if (c[i] != -1) k++;
	}
	g << k << endl;

	for (int i = 1; i <= na; i++){
		if (c[i] != -1) g << i << " " << c[i] - na<< endl;
	}
	return 0;
}