Pagini recente » Cod sursa (job #2551620) | Cod sursa (job #2834634) | Cod sursa (job #1541236) | Cod sursa (job #2857962) | Cod sursa (job #2962697)
#include <vector>
#include <queue>
#include <cstring>
#include <fstream>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n, m, e;
bool vizitat[10001];
vector <int> adj[10001];
int st[10001], dr[10001];
bool cuplaj(int node) // cupleaza partitiile stanga si dreapta
{
if(vizitat[node])
return false;
vizitat[node] = true;
for(auto vecin : adj[node]) // cautam sa vedem daca nodul mai are vecini care nu sunt inca cuplati
if (dr[vecin] == 0)
{
st[node] = vecin;
dr[vecin] = node;
return true;
}
for(auto vecin : adj[node])
{
if(cuplaj(dr[vecin]))
{
st[node] = vecin;
dr[vecin] = node;
return true;
}
}
return false;
}
int main()
{
int x, y, nrcuplaje = 0, i;
bool cuplate;
f >> n >> m >> e;
for(i = 1; i <= e; ++i)
{
f >> x >> y;
adj[x].push_back(y);
}
do{
memset(vizitat, false, sizeof(vizitat));
cuplate = false;
for(i = 1; i <= n; ++i)
if(st[i] == 0)
cuplate |= cuplaj(i);
}while(cuplate); //cat timp facem cuplaje
for(int i = 1; i <= n; ++i)
if(st[i] != 0)
nrcuplaje++;
g << nrcuplaje << endl;
for(i = 1; i <= n; i++)
if(st[i] != 0)
g << i << " " << st[i] << endl;
return 0;
}