Pagini recente » Cod sursa (job #1212218) | Cod sursa (job #2174262) | Cod sursa (job #353209) | Cod sursa (job #786630) | Cod sursa (job #2244987)
#include <cstdio>
#include <bitset>
#include <vector>
using namespace std;
bitset <10001> f;
vector <int> v[10001];
int l[10001],r[10001];
int cuplez (int nod){
int i,vecin;
f[nod]=1;
for (i=0;i<v[nod].size();i++){
vecin=v[nod][i];
if (!r[vecin]){ /// il cuplez direct
l[nod]=vecin;
r[vecin]=nod;
return 1;
}
}
/// altfel, caut alta modalitate
for (i=0;i<v[nod].size();i++){
vecin=v[nod][i];
if (!f[r[vecin]] && cuplez (r[vecin])){ /// il pot cupla pe nod cu vecin
l[nod]=vecin;
r[vecin]=nod;
return 1;
}
}
return 0;
}
int main()
{
FILE *fin=fopen ("cuplaj.in","r");
FILE *fout=fopen ("cuplaj.out","w");
int st,dr,m,x,y,ok,i,sol;
fscanf (fin,"%d%d%d",&st,&dr,&m);
for (i=1;i<=m;i++){
fscanf (fin,"%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
do{
ok=0;
f.reset();
for (i=1;i<=st;i++){
if (!l[i])
ok=(ok|cuplez(i));
}
}
while (ok==1);
sol=0;
for (i=1;i<=dr;i++)
if (r[i])
sol++;
fprintf (fout,"%d\n",sol);
for (i=1;i<=dr;i++)
if (r[i])
fprintf (fout,"%d %d\n",r[i],i);
return 0;
}