Cod sursa(job #2582329)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 16 martie 2020 16:40:21
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

const int INF = 0x3f3f3f3f;

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

vector<int> adj[10041];

int paira[10041], pairb[10041];
int dist[10041];

int n, m, e;
void read(){
	fin >> n >> m >> e;
	for(int i = 0; i < e; ++i){
		int a, b;
		fin >> a >> b;
		adj[a].push_back(b);
	}
}

queue<int> qu;
bool bfs(){
	for(int a = 1; a <= n; ++a){
		if(paira[a] == 0){
			qu.push(a);
			dist[a] = 0;
		}else{
			dist[a] = INF;
		}
	}
	
	dist[0] = INF;
	while(!qu.empty()){
		int a = qu.front();
		qu.pop();
		if(dist[a] < dist[0]){
			for(auto b : adj[a]){
				if(dist[pairb[b]] == INF){
					dist[pairb[b]] = dist[a]+1;
					qu.push(pairb[b]);
				}
			}
		}
	}
	// cout << dist[0] << " ";
	return dist[0]!=INF;
}

bool dfs(int a){
	if(a == 0){
		return true;
	}
	for(auto b : adj[a]){
		if(dist[pairb[b]] == dist[a]+1 && dfs(pairb[b])){
			paira[a] = b;
			pairb[b] = a;
			return true;
		}
	}
	dist[a] = INF;
	return false;
}

int ans = 0;
void solve(){
	while(bfs()){
		for(int a = 1; a <= n; ++a){
			if(paira[a] == 0 && dfs(a)){
				ans++;
			}
		}
	}
}

void write(){
	fout << ans << "\n";
	for(int a = 1; a <= n; ++a){
		if(paira[a] != 0){
			fout << a << " " << paira[a] << "\n";
		}
	}
}

int main(){
	read();
	solve();
	write();
	return 0;
}