Pagini recente » Cod sursa (job #2196043) | Cod sursa (job #2402215) | Cod sursa (job #2425862) | Cod sursa (job #638464) | Cod sursa (job #1399564)
#include <fstream>
#include<vector>
#include<cstring>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n,m,i,a,b,sol,ok,j,l[10010],r[10010],vizitat[10010];
vector<int> v[10010];
int cuplaj(int x)
{
if(vizitat[x]) return 0;
vizitat[x]=1;
for(int i=0;i<v[x].size();++i)
{
int aux=v[x][i];
if(r[aux]==0) //nu e cuplat nodul aux din dreapta
{
r[aux]=x;
l[x]=aux;
return 1;
}
}
for(int i=0;i<v[x].size();++i)
{
int aux=v[x][i];
if(cuplaj(r[aux])) // daca se poate recupla nodul din stanga cuplat deja cu nodul cu care incercam sa cuplam nodul actual
{
r[aux]=x;
l[x]=aux;
return 1;
}
}
return 0;
}
int main()
{
fin>>a>>b>>m;
for(i=1;i<=m;++i)
{
fin>>a>>b;
v[a].push_back(b);
//v[b].push_back(a);
}
ok=1;
while(ok)
{
ok=0;
memset(vizitat,0,sizeof(vizitat));
for(i=1;i<=a;++i)
{
if(l[i]==0)
{
ok+=cuplaj(i);
}
}
}
for(i=1;i<=a;++i)
{
if(l[i])
sol++;
}
fout<<sol<<'\n';
for(i=1;i<=a;++i)
{
if(l[i])
fout<<i<<" "<<l[i]<<'\n';
}
return 0;
}