Pagini recente » Cod sursa (job #2266490) | Cod sursa (job #1857853) | Cod sursa (job #2414202) | Cod sursa (job #2732277) | Cod sursa (job #2819982)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
class Graf
{
int numar_noduri, numar_muchii;
vector <vector <int>> lista_adiacenta;
public:
void cuplaj_maxim_initializare();
int dfs_cuplaj_maxim(int, vector <int> &, int[], int[]);
};
int Graf :: dfs_cuplaj_maxim(int x, vector <int> &vizitat, int v1[], int v2[])
{
if(vizitat[x])
return 0;
vizitat[x] = 1;
vector <int> :: iterator j;
for(j = lista_adiacenta[x].begin(); j < lista_adiacenta[x].end(); j++)
if(!v2[*j])
{
v1[x] = *j;
v2[*j] = x;
return 1;
}
for(j = lista_adiacenta[x].begin(); j < lista_adiacenta[x].end(); j++)
if(dfs_cuplaj_maxim(v2[*j], vizitat, v1, v2))
{
v2[*j] = x;
v1[x] = *j;
return 1;
}
return 0;
}
void Graf :: cuplaj_maxim_initializare()
{
int cardinal_multime_1, cardinal_multime_2, capat_stang, capat_drept;
fin >> cardinal_multime_1 >> cardinal_multime_2 >> numar_muchii;
vector <int> vizitat;
vector <pair<int, int>> cuplaj_maxim;
int v1[cardinal_multime_1 + 1] = {}, v2[cardinal_multime_2 + 1] = {}, ok = 1;
for(int i = 0; i < cardinal_multime_1; i++)
vizitat.push_back(0);
lista_adiacenta.resize(cardinal_multime_1 + 1);
for(int i = 0; i < numar_muchii; i++)
{
fin >> capat_stang >> capat_drept;
lista_adiacenta[capat_stang].push_back(capat_drept);
}
while(ok)
{
ok = 0;
for(int i = 0; i < vizitat.size(); i++)
vizitat[i] = 0;
for(int i = 1; i <= cardinal_multime_1; i++)
if(!v1[i])
if(dfs_cuplaj_maxim(i, vizitat, v1, v2) == 1)
ok = 1;
}
for(int i = 1; i <= cardinal_multime_1; i++)
if(v1[i])
cuplaj_maxim.push_back(make_pair(i, v1[i]));
fout << cuplaj_maxim.size() << '\n';
for(int i = 1; i < cuplaj_maxim.size(); i++)
fout << cuplaj_maxim[i].first << " " << cuplaj_maxim[i].second << '\n';
lista_adiacenta.clear();
}
int main()
{
Graf x;
x.cuplaj_maxim_initializare();
fin.close();
fout.close();
return 0;
}