Pagini recente » Cod sursa (job #1847175) | Cod sursa (job #2482020) | Cod sursa (job #1922326) | Cod sursa (job #2400462) | Cod sursa (job #1436163)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector<int> G[10005];
int l,r,m, pereche[10005], viz[10005];
bool imperechere(int nod, int culoare)
{
viz[nod]=culoare;
for(int i=0;i<G[nod].size();i++)//vecinii nodului
{
int vecin=G[nod][i];
if(viz[vecin]!=culoare)//daca nu are pereche in culoarea asta
{
viz[vecin]=culoare;
if(pereche[vecin]==0 || imperechere(pereche[vecin],culoare)==1)//daca nu are pereche sau daca i-am gasit alta pereche perechii; in cazul in care nu se mai gaseste alta pereche, singurul efect este colorarea perechii
{
pereche[nod]=vecin;
pereche[vecin]=nod;
return 1;
}
}
}
return false;
}
int main()
{
int a,b,i,culoare=0,nr_perechi=0;
f>>l>>r>>m;
for(i=1;i<=m;i++)
{
f>>a>>b;
b=b+l;
G[a].push_back(b);
G[b].push_back(a);
}
bool ok=1;
while(ok==1)//cat timp se pot face perechi
{
culoare++;//se incearca diverse colorari(moduri de a imperechea) pana cand se atinge numarul maxim de perechi si ok ramane 0
ok=0;
for(i=1;i<=l;i++)
if(pereche[i]==0)//daca nodul nu are pereche
if(imperechere(i,culoare)==1)//daca nodul a fost imperecheat
{
nr_perechi++;
ok=1;//s-a facut o pereche
}
}
g<<nr_perechi<<'\n';
for(i=1;i<=l;i++)
if(pereche[i]!=0)
g<<i<<' '<<pereche[i]-l<<'\n';
return 0;
}