Cod sursa(job #2705071)

Utilizator ViAlexVisan Alexandru ViAlex Data 11 februarie 2021 20:38:27
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<cstring>
#include<map>
#include<algorithm>
#include<set>
#include<deque>
#include<queue>
 
#define FAST cin.tie(NULL); ios_base::sync_with_stdio(false);
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
 
const int mx=10010;
 
int n,m,k;
vector<int> g[mx];
bool used[mx],used1[mx];
int mt[mx];
 
 
void read(){
	
	fin>>n>>m>>k;
	
	for(int i=0;i<mx;i++){
		mt[i]=-1;
	}
 
	int p,q;
	for(int i=0;i<k;i++){
		fin>>p>>q;
		p--;q--;
		g[p].push_back(q);
	}
}
 
bool kuhn(int node){
	if(used[node]){
		return false;
	}
 
	used[node]=true;
 
	for(int next:g[node]){
		if(mt[next]==-1 || kuhn(mt[next])){
			mt[next]=node;
			return true;
		}	
	}
	return false;
}
 
void solve(){
	
	for(int i=0;i<n;i++){
		for(int next:g[i]){
			if(mt[next]==-1){
				mt[next]=i;
				used1[i]=true;
				break;
			}
		}
	}

	for(int i=0;i<n;i++){
		if(used1[i])
			continue;

		for(int k=0;k<n;k++){
			used[k]=false;
		}
		kuhn(i);
	}	
	vector<std::pair<int,int>> result;
	for(int i=0;i<m;i++){
		if(mt[i]!=-1){
			result.push_back({mt[i]+1,i+1});
		}
	}
	fout<<result.size()<<endl;
	for(auto pr:result)
		fout<<pr.first<<" "<<pr.second<<'\n';
 
}
 
 
int main(){
	FAST
	read();
	solve();
	return 0;
}