Pagini recente » Cod sursa (job #795914) | Cod sursa (job #867972) | Cod sursa (job #1915575) | Cod sursa (job #1891275) | Cod sursa (job #2967181)
#include <fstream>
#include <iostream>
#include <vector>
#define N_MAX 20001
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector<int> la[N_MAX];
bool viz[N_MAX];
int tata[N_MAX];
bool realizare_cuplaj(int nod)//O(sqrt(V)*E), unde V - nr de noduri, E - nr de muchii
{
viz[nod] = 1;
for(int i : la[nod])
{
if(tata[i] == 0)// daca nu are tata atunci reunim
{
tata[nod] = i;
tata[i] = nod;
return 1;
}
if(viz[tata[i]]==0 && realizare_cuplaj(tata[i]))// vedem daca putem forma o alta pereche cu nod adiacent
{
tata[nod] = i;
tata[i] = nod;
return 1;
}
}
return 0;
}
int main()
{
int N, M, E, nr = 0;
f>>N>>M>>E;
for(int i = 0; i < E; i++)
{ int x,y;
f>>x>>y;
y += N; // vedem cate nod avem in mult ini ca sa putem verif ca s unice
la[x].push_back(y);
}
bool ok = 1;
while(ok == 1)
{
ok = 0;
for(int i = 1; i <= N; i++)
if(!viz[i] && !tata[i] && realizare_cuplaj(i))// daca nodul nu are tata si nu e vizitat incercam sa facem perechea
{
nr++;
ok = 1;
}
for(int i = 1; i <= N + M; i++)
viz[i] = 0;
}
g << nr << '\n';
for(int i = 1; i <= N; i++)
if(tata[i] != 0)
g << i << " " << tata[i] - N << '\n';
return 0;
}