Pagini recente » Cod sursa (job #49770) | Cod sursa (job #1788379) | Cod sursa (job #719843) | Cod sursa (job #2157175) | Cod sursa (job #2962450)
// Created by elena on 1/8/2023.
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector<int> graf[20001];
bool visited[20001];
int parent[20001];
//fac cuplajul partitiilor:
bool cuplaj(int nod)
{
visited[nod] = true;
for(int vecin : graf[nod])
{
// daca un vecin al nodului curent nu a fost inca cuplat, formez pereche:
if(parent[vecin] == 0)
{
parent[nod] = vecin;
parent[vecin] = nod;
return true; //cuplat
}
//la a doua parcurgere incercam sa cuplam nodul necuplat
if(visited[parent[vecin]]==false && cuplaj(parent[vecin]))
{
parent[nod] = vecin;
parent[vecin] = nod;
return true; //cuplat
}
}
return false; //necuplat
}
int main()
{
int n, m, e, x, y, c = 0;
bool cuplat = true;
f>>n>>m>>e;
for(int i = 0; i < e; i++)
{
f>>x>>y;
y += n; //+n pt diferentierea nodurilor din partitii care au aceeasi valoare
//se scade n la final la afisarea perechilor
graf[x].push_back(y);
}
do
{
cuplat = false;
for(int i = 1; i <= n; i++)
//caut nodurile necuplate:
if(!visited[i] && !parent[i] && cuplaj(i))
{
c++;
cuplat = true;
}
// reinit vectorul de vizitati pentru a mai incerca o data cuplajul nodurilor ramase
for(int i = 1; i <= n + m; i++)
visited[i] = false;
}while(cuplat);
g << c << '\n';
for(int i = 1; i <= n; i++)
if(parent[i] != 0)
g << i << " " << parent[i] - n << '\n';
return 0;
}