Pagini recente » Cod sursa (job #382704) | Cod sursa (job #3004023) | Borderou de evaluare (job #1128049) | Cod sursa (job #666405) | Cod sursa (job #2411249)
#include <fstream>
#include <vector>
using namespace std;
ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");
int N,M,E;
vector <int> V[10001];
int L[10001]; /// L[i] arata varful din partea dreapta cu care este conectat varful i din partea stanga
int R[10001]; /// R[i] arata varful din partea stanga cu care este conectat varful i din partea dreapta
int U[10001];
int cupleaza(int sursa)
{
if (U[sursa]==1)
return 0;
U[sursa]=1;
for (int i=0;i<V[sursa].size();i++)
{
int p;
p=V[sursa][i];
if (R[p]==0)
{
L[sursa]=p;
R[p]=sursa;
return 1;
}
}
for (int i=0;i<V[sursa].size();i++)
{
int p;
p=V[sursa][i];
if (cupleaza(R[p]))
{
L[sursa]=p;
R[p]=sursa;
return 1;
}
}
return 0;
}
int main()
{
fi>>N>>M>>E;
for (int i=1;i<=E;i++)
{
int x,y;
fi>>x>>y;
V[x].push_back(y);
}
while (1)
{
int t;
for (int i=1;i<=N;i++)
U[i]=0;
t=0;
for (int i=1;i<=N;i++)
if (L[i]==0)
t=t | cupleaza(i);
if (t==0)
break;
}
int rez;
rez=0;
for (int i=1;i<=N;i++)
if (L[i]!=0)
rez++;
fo<<rez<<"\n";
for (int i=1;i<=N;i++)
if (L[i]!=0)
fo<<i<<" "<<L[i]<<"\n";
fi.close();
fo.close();
return 0;
}