Pagini recente » Cod sursa (job #3122288) | Cod sursa (job #223222) | Cod sursa (job #2581081) | Cod sursa (job #351167) | Cod sursa (job #300103)
Cod sursa(job #300103)
#include<fstream.h>
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int a[1001][1001],V[1001][1001],n;
int fmax=0,i,j,s,d,x[1001][3],Q[1001],p[1001],t[1001],gasit,v,p1,p2;
int main()
{ int e,f;
fin>>n>>e>>f;
while(fin>>e>>f)
{ a[e][f]=1;
a[0][e]=1;
a[f][n+1]=1;
V[e][0]++;
if(V[0][p1]!=e)
{ V[0][++p1]=e;
V[0][0]++;
}
V[e][V[e][0]]=f;
V[f][0]=1;
V[f][1]=n+1;
}
do { gasit=0;
for(i=0;i<=n+1;i++)
{ Q[i]=0;
p[i]=0;
t[i]=0;
}
s=d=1;
p[0]=1;
Q[0]=1;
while(s<=d)
{ for(i=1;i<=V[Q[s]][0];i++)
{ int j=V[Q[s]][i];
if(p[j]==0&&a[Q[s]][j]>0)
{ d++;
Q[d]=j;
p[j]=1;
t[j]=Q[s];
if(j==n+1) gasit=1;
}
}
s++;
}
if(gasit)
{ int k=0;
v=n+1;
while(v!=0)
{ k++;
x[k][1]=t[v];
x[k][2]=v;
v=t[v];
}
int min=10000;
for(i=1;i<=k;i++)
if(min>a[x[i][1]][x[i][2]])
min=a[x[i][1]][x[i][2]];
fmax+=min;
for(i=1;i<=k;i++)
{ int b=x[i][1];
int c=x[i][2];
a[b][c]=a[b][c]-min;
a[c][b]+=min;
}
}
}while(gasit);
fout<<fmax<<"\n";
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i>j) if(a[i][j]==1) fout<<j<<" "<<i<<"\n";
fin.close();
fout.close();
return 0;
}