Pagini recente » Profil dvd46328 | Cod sursa (job #1015099) | Cod sursa (job #2422939) | Cod sursa (job #1949447) | Cod sursa (job #1612906)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
static bool repair(const int x, vector<bool>& use, const vector<vector<int>>& vec,
vector<int>& dr, vector<int>& st){
if(use[x]){
return false;
}
use[x] = true;
for(int i = 0; i < vec[x].size(); ++i){
if(st[vec[x][i]] == -1){
dr[x] = vec[x][i];
st[vec[x][i]] = x;
return true;
}
}
for(int i = 0; i < vec[x].size(); ++i){
if(repair(st[vec[x][i]], use, vec, dr, st)){
dr[x] = vec[x][i];
st[vec[x][i]] = x;
return true;
}
}
return false;
}
static void cuplaj(const int m, const vector<vector<int>>& vec, vector<int>& dr){
const int n = vec.size();
static vector<bool> use(n, false);
static vector<int> st(m, -1);
fill(dr.begin(), dr.end(), -1);
for(bool changed = true; changed; ){
changed = false;
fill(use.begin(), use.end(), false);
for(int i = 0; i < n; ++i){
if(dr[i] == -1){
changed = (repair(i, use, vec, dr, st) || changed);
}
}
}
}
int main()
{
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n, m, e;
f >> n >> m >> e;
static vector<vector<int>> vec(n);
for(int i = 0, a, b; i < e; ++i){
f >> a >> b;
vec[a-1].push_back(b-1);
}
static vector<int> dr(n);
cuplaj(m, vec, dr);
int rez = n - count(dr.begin(), dr.end(), -1);
g << rez << '\n';
for(int i = 0; i < n; ++i){
if(dr[i] != -1){
g << i+1 << ' ' << dr[i]+1 << '\n';
}
}
return 0;
}