Pagini recente » Cod sursa (job #751101) | Cod sursa (job #733574) | Cod sursa (job #1261081) | Utilizatori inregistrati la Infoarena Monthly 2012 - Runda 10 | Cod sursa (job #1407994)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int vizitat[22222],pereche[22222],rez;
vector<int> vecini[22222];
bool pairUp(int nod,int culoare)
{
int i,x,j,y;
vizitat[nod]=culoare;
for(i=0;i<vecini[nod].size();++i)
{
x=vecini[nod][i];
if(vizitat[x]==culoare)
continue;
vizitat[x]=culoare;
if(pereche[x]==0)
{
pereche[x]=nod;
pereche[nod]=x;
return true;
}
if(pairUp(pereche[x],culoare)==true)
{
pereche[x]=nod;
pereche[nod]=x;
return true;
}
for(j=0;j<vecini[x].size();++j)
{
y=vecini[x][j];
if(vizitat[y]==culoare)
continue;
if(pairUp(y,culoare)==true)
++rez;
}
}
return false;
}
int main()
{
int n1,n2,m,i,a,b;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
in>>n1>>n2>>m;
for(i=1;i<=m;++i)
{
in>>a>>b;
b+=n1;
vecini[a].push_back(b);
vecini[b].push_back(a);
}
for(i=1;i<=n1;++i)
{
if(pereche[i]==0)
{
if(pairUp(i,i))
++rez;
}
}
out<<rez<<"\n";
for(i=1;i<=n1;++i)
{
if(pereche[i]!=0)
{
out<<i<<" "<<pereche[i]-n1<<"\n";
}
}
return 0;
}