Pagini recente » Cod sursa (job #3128617) | Cod sursa (job #1375529) | Cod sursa (job #2253257) | Cod sursa (job #2139628) | Cod sursa (job #2844077)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
vector <int> adj[10005];
int n, m , e;
int st[10005], dr[10005];
bitset <10005> viz;
void Citire ()
{
int i, j;
fin >> n >> m >> e;
for (int k = 1; k <= e; k++)
{
fin >> i >> j;
adj[i].push_back(j);
}
}
int Cuplaj (int nod)
{
if (viz[nod] == 1)
return 0;
viz[nod] = 1;
for (int nod_2 : adj[nod]) /// caut in adiacentii lui nod
{
if (dr[nod_2] == 0) /// dr[nod_2] = 0 => nod_2 nu este cuplat
{
/// cuplez nodurile nod si nod_2
st[nod] = nod_2;
dr[nod_2] = nod;
return 1;
}
}
/// daca ajung aici, toti adiacentii lui nod sunt deja cuplati
/// incerc sa "decuplez" fiecare dintre adiacentii lui nod
/// repetand aceeasi procedura
for (int nod_2 : adj[nod])
{
if (Cuplaj(dr[nod_2]) == 1)
{
/// cuplez acum nod_2 cu nod
st[nod] = nod_2;
dr[nod_2] = nod;
return 1;
}
}
/// daca ajung aici nu se mai pot realiza cuplaje
return 0;
}
void Cuplaj_Max()
{
int i, done = 0, cnt = 0;
while (!done)
{
done = 1;
viz.reset();
for (i = 1; i <= n; i++)
if (st[i] == 0 && Cuplaj(i))
{
done = 0;
cnt++;
}
}
fout << cnt << "\n";
for (int i = 1; i <= n; i++)
if (st[i] != 0)
fout << i << " " << st[i] << "\n";
}
int main()
{
Citire();
Cuplaj_Max();
return 0;
}