Pagini recente » Cod sursa (job #2859278) | Cod sursa (job #1343118) | Cod sursa (job #2645285) | Cod sursa (job #135913) | Cod sursa (job #2844789)
/*
Fara random momentan
*/
#include <bits/stdc++.h>
#define NMAX 10000 //zece mii
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
int N, M, E;
vector <int> G[NMAX + 1];
void Read(){
fin >> N >> M >> E;
for(int i = 1; i <= E; i++){
int x, y;
fin >> x >> y;
x--;
y--;
G[x].push_back(y);
}
}
bool gasim(int x, vector<int>& fata, vector<int>& baiat, vector<bool>& viz){
if(viz[x]){
return false; //deci printr-o iteratie a algoritmului, putem trece doar o data printr-un baiat
/*
si daca incercam iar sa trecem, returneaza false
*/
}
viz[x] = true;
for(auto& y : G[x]){
if(baiat[y] == -1){
fata[x] = y;
baiat[y] = x;
return true;
}
}
for(auto& y : G[x]){
if( gasim( baiat[y], fata, baiat, viz ) ){
fata[x] = y;
baiat[y] = x;
return true;
}
}
return false;
}
void Solve(){
vector<int> fata(N);
for(auto& x : fata){
x = -1;
}
vector<int> baiat(M);
for(auto& x : baiat){
x = -1;
}
vector <bool> viz(N);
for(int i = 0; i < N; i++){
viz[i] = false;
}
bool stop = false;
while(!stop){
for(int i = 0; i < N; i++){
viz[i] = false;
}
stop = true;
for(int x = 0; x < N; x++){
if( fata[x] == -1 && gasim(x, fata, baiat, viz) ){
stop = false;
}
}
}
///afisare
int nr_rsp = 0;
for(int i = 0; i < N; i++){
if(fata[i] != -1){
nr_rsp++;
}
}
fout << nr_rsp << "\n";
for(int i = 0; i < N; i++){
if(fata[i] != -1){
fout << i + 1 << ' ' << fata[i] + 1 << "\n";
}
}
}
int main()
{
Read();
Solve();
return 0;
}