Pagini recente » Cod sursa (job #1385019) | Cod sursa (job #1621883) | Cod sursa (job #158397) | Cod sursa (job #3174003) | Cod sursa (job #716475)
Cod sursa(job #716475)
#include <stdio.h>
#include <vector>
using namespace std;
#define FI fopen("cuplaj.in","r")
#define FO fopen("cuplaj.out","w")
vector<int> nodLeg[2][10001];
int nodLen[2],nrSol;
int cup[2][10001];
int nod[2][10001]; //0 - left; 1 - right
void citeste(FILE *f) {
long e,i;
int a,b;
fscanf(f,"%i%i%li",&nodLen[0],&nodLen[1],&e);
for(i=0;i<e;i++) {
fscanf(f,"%i%i",&a,&b);
nodLeg[0][a].push_back(b);
nodLeg[1][b].push_back(a);
}
}
void scrie(FILE *f) {
int i,j;
fprintf(f,"%i\n",nrSol);
for(i=0,j=0;i<nodLen[0] && j<nrSol;i++)
if(cup[0][i+1]) {
fprintf(f,"%i %i\n",i+1,cup[0][i+1]);
j++;
}
}
int resolveCuplaj(int nodA,int nodSide) {
int i,lim;
lim=nodLeg[nodSide][nodA].size();
nod[nodSide][nodA]=1;
for(i=0;i<lim;i++)
if(cup[nodSide^1][nodLeg[nodSide][nodA][i]]==0 && nod[nodSide^1][nodLeg[nodSide][nodA][i]]==0) {
cup[nodSide^1][cup[nodSide][nodA]]=0;
cup[nodSide^1][nodLeg[nodSide][nodA][i]]=nodA;
cup[nodSide][nodA]=nodLeg[nodSide][nodA][i];
nod[nodSide][nodA]=0;
return 1;
}
for(i=0;i<lim;i++)
if(nod[nodSide^1][nodLeg[nodSide][nodA][i]]==0) {
nod[nodSide^1][nodLeg[nodSide][nodA][i]]=1;
if(resolveCuplaj(cup[nodSide^1][nodLeg[nodSide][nodA][i]],nodSide)) {
cup[nodSide^1][nodLeg[nodSide][nodA][i]]=nodA;
cup[nodSide][nodA]=nodLeg[nodSide][nodA][i];
nod[nodSide][nodA]=0;
nod[nodSide^1][nodLeg[nodSide][nodA][i]]=0;
return 1;
}
nod[nodSide^1][nodLeg[nodSide][nodA][i]]=0;
}
nod[nodSide][nodA]=0;
return 0;
}
int main() {
int i;
citeste(FI);
for(i=0;i<nodLen[0];i++) {
nrSol+=resolveCuplaj(i+1,0);
}
scrie(FO);
return 0;
}