Pagini recente » Cod sursa (job #729896) | Cod sursa (job #1391775) | Cod sursa (job #914827) | Cod sursa (job #1270562) | Cod sursa (job #549217)
Cod sursa(job #549217)
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define maxn 2*10005
#define infinit 1<<30
int * a[maxn];
int * q;
int dist[maxn],pereche[maxn];
int n,m,cuplaj;
void citire(void)
{ FILE *fin=fopen("cuplaj.in","r");
int e,x,y;
fscanf(fin,"%d%d%d",&n,&m,&e);
for(int k=1;k<=n+m;k++)
a[k]=(int*)realloc(a[k],sizeof(int)), a[k][0]=0;
for(; e; e--)
{ fscanf(fin,"%d%d",&x,&y);
y+=n;
a[x][0]++;
a[x]=(int*)realloc(a[x], sizeof(int)*(a[x][0]+1));
a[x][a[x][0]]=y;
a[y][0]++;
a[y]=(int*)realloc(a[y], sizeof(int)*(a[y][0]+1));
a[y][a[y][0]]=x;
}
fclose(fin);
}
int bfs(void)
{ int v,u,k;
int prim,ultim;
prim=ultim=0;
for(v=1;v<=n;v++)
if(!pereche[v])
{ dist[v]=0;
q=(int*)realloc(q,sizeof(int)*(ultim+1));
q[ultim++]=v;
}
else dist[v]=infinit;
dist[0]=infinit;
while(prim<ultim)
{ v=q[prim++];
if(v!=0)
for(k=1; k<=a[v][0]; k++)
{ u=a[v][k];
if(dist[pereche[u]]==infinit)
{ dist[pereche[u]]=dist[v]+1;
q=(int*)realloc(q,(ultim+1)*sizeof(int));
q[ultim++]=pereche[u];
}
}
}
return dist[0]!=infinit;
}
int dfs(int v)
{ int i,u;
if(v!=0)
{ for(i=1; i<=a[v][0]; i++)
{ u=a[v][i];
if(dist[pereche[u]]==dist[v]+1)
if(dfs(pereche[u]))
{ pereche[u]=v;
pereche[v]=u;
return 1;
}
}
dist[v]=infinit;
return 0;
}
return 1;
}
void HopcroftKarp(void)
{ cuplaj=0;
while(bfs())
for(int v=1; v<=n; v++)
if(!pereche[v])
if(dfs(v)) cuplaj++;
}
void scrie(void)
{ FILE *fout=fopen("cuplaj.out","w");
fprintf(fout,"%d\n",cuplaj);
for(int i=1;i<=n;i++)
if(pereche[i]!=0) fprintf(fout,"%d %d\n",i,pereche[i]-n);
fclose(fout);
}
int main(void)
{ citire();
HopcroftKarp();
scrie();
return 0;
}