Pagini recente » Cod sursa (job #2055687) | Cod sursa (job #2347620) | Cod sursa (job #385179) | Cod sursa (job #609387) | Cod sursa (job #2818689)
#include <bits/stdc++.h>
using namespace std;
/**
Cuplax maxim in graf bipartit
*/
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int N, M, E;
vector<int> L[10002]; /// listele de adiacenta
bitset<10002> viz; /// viz[i]=1 daca i este deja cuplat
int st[10002], dr[10002], ans;
/// (k,i) - muchie in cuplaj => st[k]=i, dr[i]=k
void Citire()
{
int i, j;
fin >> N >> M >> E;
for (int k = 1; k <= E; k++)
{
fin >> i >> j;
L[i].push_back(j);
}
}
bool Cupleaza(int k)
{
if (viz[k] == 1) return false;
viz[k] = 1;
for (int i : L[k])
if (dr[i] == 0) /// am gasit un adiacent necuplat
{
/// cuplam nodurile (k, i)
st[k] = i;
dr[i] = k;
return true;
}
for (int i : L[k])
if (Cupleaza(dr[i]))
{
st[k] = i;
dr[i] = k;
return true;
}
return false;
}
void CuplajMax()
{
int i, gata = 0;
while (gata == 0)
{
gata = 1;
viz.reset();
for (i = 1; i <= N; i++)
if (st[i] == 0 && Cupleaza(i))
{
ans++;
gata = 0;
}
}
}
void Afis()
{
fout << ans << "\n";
for (int i = 1; i <= N; i++)
if (st[i] > 0)
fout << i << " " << st[i] << "\n";
}
int main()
{
Citire();
CuplajMax();
Afis();
fin.close();
fout.close();
return 0;
}