Pagini recente » Cod sursa (job #1737721) | Cod sursa (job #175926) | Cod sursa (job #3201939) | Cod sursa (job #823646) | Cod sursa (job #2961990)
#include <bits/stdc++.h>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector<vector<int>> bp;
int n,m,e;
bool bpm(int leftNode, bool visited[], int left[])
{
for(auto j: bp[leftNode]) //iau fiecare valoare din dreapta care are muchie cu nodul meu din stanga
{
if(!visited[j])
{
visited[j] = true;
//daca nodul din dreapta inca nu are cuplaj,
//sau daca pot gasi un alt cuplaj pentru nodul din stanga care are cuplaj
//cu nodul meu curent din dreapta
if(left[j]<0 || bpm(left[j], visited, left))
{
left[j] = leftNode;
return true;
}
}
}
return false;
}
int maxMatch(int left[])
{
int res=0;
for(int i=1; i<=n; i++)
{
bool visited[m+1]; //vector in care retin nodurile din dreapta incercate pentru i
memset(visited, 0, sizeof(visited));
if(bpm(i,visited, left)==true)
res++;
}
return res;
}
int main()
{
int lft, rig, left[10001];
bp.resize(10001);
f>>n>>m>>e;
for(int i=1;i<=m;i++)
left[i]= -1;
for(int i=1;i<=e;i++)
{
f>>lft>>rig;
bp[lft].push_back(rig);
}
g<<maxMatch(left)<<'\n';
for(int i = 1; i<=m;i++)
if(left[i]!= -1)
g<<left[i]<<' '<<i<<'\n';
return 0;
}