Pagini recente » Cod sursa (job #178336) | Cod sursa (job #549257) | Cod sursa (job #1818750) | Cod sursa (job #452386) | Cod sursa (job #782726)
Cod sursa(job #782726)
#include<stdio.h>
#define inf 2000000000
#define dim 10010
FILE*f=fopen("cuplaj.in","r");
FILE*g=fopen("cuplaj.out","w");
int i,n,m,e,C[dim][dim],F[dim][dim],T[dim],a,b,viz[dim],z,s,j,x,min,R[2*dim][3];
struct nod{
int nr;
nod* adr;
}*p,*c,*L[dim];
void read(){
fscanf(f,"%d%d%d",&n,&m,&e);
for(i=1;i<=n;i++){
p=new nod;
p->nr=i;
p->adr=L[0];
L[0]=p;
p=new nod;
p->nr=0;
p->adr=L[i];
L[i]=p;
C[0][i]=1;
}
for(i=n+1;i<=n+m;i++){
p=new nod;
p->nr=n+m+1;
p->adr=L[i];
L[i]=p;
p=new nod;
p->nr=i;
p->adr=L[n+m+1];
L[n+m+1]=p;
C[i][n+m+1]=1;
}
for(i=1;i<=e;i++){
fscanf(f,"%d%d",&a,&b);
p=new nod;
p->nr=n+b;
p->adr=L[a];
L[a]=p;
p=new nod;
p->nr=a;
p->adr=L[n+b];
L[n+b]=p;
C[a][n+b]=1;
}
}
int bfs(){
for(i=0;i<=n+m+1;i++)
viz[i]=0;
int D[dim];D[1]=0;viz[0]=1;
int p=1,u=1,ok=0;
while(p<=u){
x=D[p];
if(x==(n+m+1)){
p++;
continue;
}
c=L[x];
while(c){
if(!viz[c->nr]&&C[x][c->nr]>F[x][c->nr]){
D[++u]=c->nr;
viz[c->nr]=1;
T[c->nr]=x;
if(c->nr==n+m+1)
ok=1;
}
c=c->adr;
}
p++;
}
return ok;
}
int main(){
read();
while(bfs()){
c=L[n+m+1];
while(c){
if(viz[c->nr]&&C[c->nr][n+m+1]>F[c->nr][n+m+1]){
T[n+m+1]=c->nr;
z=n+m+1;min=inf;
while(T[z]){
if(C[T[z]][z]-F[T[z]][z]<min)
min=C[T[z]][z]-F[T[z]][z];
z=T[z];
}
if(C[T[z]][z]-F[T[z]][z]<min)
min=C[T[z]][z]-F[T[z]][z];
if(min==inf)
continue;
z=n+m+1;
while(T[z]){
F[T[z]][z]+=min;
F[z][T[z]]-=min;
z=T[z];
}
F[T[z]][z]+=min;
F[z][T[z]]-=min;
}
c=c->adr;
}
}
for(i=1;i<=n;i++){
c=L[i];
while(c){
if(c->nr==0){
c=c->adr;
continue;
}
if(F[i][c->nr]==1){
s++;
R[s][0]=i;
R[s][1]=c->nr-n;
}
c=c->adr;
}
}
fprintf(g,"%d\n",s);
for(i=1;i<=s;i++){
for(j=0;j<=1;j++)
fprintf(g,"%d ",R[i][j]);
fprintf(g,"\n");
}
return 0;
}