Pagini recente » Cod sursa (job #1602964) | Cod sursa (job #2869840) | Cod sursa (job #2749076) | Cod sursa (job #1283791) | Cod sursa (job #433545)
Cod sursa(job #433545)
#include<stdio.h>
#include<fstream>
using namespace std;
FILE *g;
int card1,card2,m,n,i,x,y,c[20000],fin[20000],stop,t[4][200000],aux,ind,ok,flux,min,nr,u,pr,k,p,q;
int parinte[20000],st[20000],v[20000],ret[20000],viz[20000];
inline int bf()
{ pr=u=1; st[1]=1; viz[1]=ind; k=0;
while(pr<=u)
{ p=c[st[pr]];
while(p!=0)
{ if(viz[t[1][p]]!=ind&&t[3][p])
if(t[1][p]!=n) { u++; st[u]=t[1][p]; parinte[t[1][p]]=st[pr]; viz[t[1][p]]=ind; }
else { k++; v[k]=st[pr]; }
p=t[2][p];
}
pr++;
}
return k;
}
int main()
{ ifstream f("cuplaj.in");g=fopen("cuplaj.out","w");
f>>card1>>card2>>m; n=card1+card2+2;
for(i=2;i<=card1+1;i++)
{ x=1; y=i;
if(c[x]==0) { nr++; c[x]=nr; fin[x]=nr; t[1][nr]=y; t[3][nr]=1; }
else { nr++; t[2][fin[x]]=nr; t[1][nr]=y; fin[x]=nr; t[3][nr]=1;}
aux=x; x=y; y=aux;
if(c[x]==0) { nr++; c[x]=nr; fin[x]=nr; t[1][nr]=y; }
else { nr++; t[2][fin[x]]=nr; t[1][nr]=y; fin[x]=nr; }
}
for(i=card1+2;i<=card1+1+card2;i++)
{ x=i; y=card1+card2+2;
/* if(c[x]==0)*/ { nr++; c[x]=nr; fin[x]=nr; t[1][nr]=y; t[3][nr]=1; }
/*else { nr++; t[2][fin[x]]=nr; t[1][nr]=y; fin[x]=nr; t[3][nr]=1;}*/
aux=x; x=y; y=aux;
if(c[x]==0) { nr++; c[x]=nr; fin[x]=nr; t[1][nr]=y; }
else { nr++; t[2][fin[x]]=nr; t[1][nr]=y; fin[x]=nr; }
}
for(i=1;i<=m;i++)
{ f>>x>>y; x++; y=card1+1+y;
if(c[x]==0) { nr++; c[x]=nr; fin[x]=nr; t[1][nr]=y; t[3][nr]=1; }
else { nr++; t[2][fin[x]]=nr; t[1][nr]=y; fin[x]=nr; t[3][nr]=1;}
aux=x; x=y; y=aux;
if(c[x]==0) { nr++; c[x]=nr; fin[x]=nr; t[1][nr]=y; }
else { nr++; t[2][fin[x]]=nr; t[1][nr]=y; fin[x]=nr; }
}
ind=1;
while(bf())
{ for(i=1;i<=k;i++)
{ x=n; parinte[n]=v[i]; min=1; ok=1; q=0;
while(x!=1&&ok)
{ p=c[parinte[x]];
while(p!=0&&ok)
{ if(t[1][p]==x) { q++; ret[q]=p; if(t[3][p]<min) { min=0; ok=0; } }
p=t[2][p];
}
x=parinte[x];
}
x=n;
if(min!=0) {
for(p=1;p<=q;p++) { t[3][ret[p]]-=min; if(ret[p]%2) t[3][ret[p]+1]+=min; else t[3][ret[p]-1]+=min; } }
flux+=min;
}
ind++; parinte[n]=0;
}
fprintf(g,"%d\n",flux);
for(i=2;i<=card1+1;i++)
{ p=c[i]; while(p!=0) { if(t[3][p]==0&&card1+2<=t[1][p]&&t[1][p]<=card1+card2+1) fprintf(g,"%ld %ld\n",i-1,t[1][p]-1-card1); p=t[2][p]; } }
fclose(g);
return 0;
}