Pagini recente » Cod sursa (job #2079844) | Cod sursa (job #3277147) | Cod sursa (job #490976) | Cod sursa (job #647658) | Cod sursa (job #1469614)
using namespace std;
#include <fstream>
#define min(x,y) ((x)<(y)?(x):(y))
#define abs(x) ((x)>0?x:-x)
FILE *f=fopen ("date.in", "r");
FILE *g=fopen ("date.out", "w");
int n1,n2,m,s,d,n;
int viz[20010];
int Q[20010];
int C[20010][20010];
int F[20010][20010];
void read();
void solve();
void write();
int bfs();
int main ()
{
read();
solve();
write();
return 0;
}
void read()
{
int x,y,i;
fscanf(f,"%d%d%d",&n1,&n2,&m);
n=n1+n2+2;
s=n-1;
d=n;
for(i=1; i<=n1; i++) C[s][i]=1;
for(i=1; i<=n2; i++) C[i+n1][d]=1;
for(i=1; i<=m; i++)
{
fscanf(f,"%d%d",&x,&y);
C[x][y+n1]=1;
}
}
void solve()
{
int i,a,b,v,lg;
int L[20010];
do
{
for(i=1; i<=n; i++) viz[i]=0;
if(bfs()) return;
L[0]=d;
lg=0;
a=b=100;
while(L[lg]!=s)
{
++lg;
L[lg]=abs(viz[L[lg-1]]);
if(viz[L[lg-1]]>0)
a=min(a,C[L[lg]][L[lg-1]]-F[L[lg]][L[lg-1]]);
else if (viz[L[lg-1]]<0)
b=min(b,F[L[lg-1]][L[lg]]);
}
v=min(a,b);
for(i=lg; i>0; i--)
if(viz[L[i-1]]>0)
F[L[i]][L[i-1]]+=v;
else
F[L[i-1]][L[i]]-=v;
} while(1);
}
void write ()
{
int i,j,nr=0;
for(i=1; i<=n1; i++)
for(j=n1+1; j<=n1+n2; j++)
if(F[i][j]) nr++;
for(i=1; i<=n1; i++)
for(j=n1+1; j<=n1+n2; j++)
if(F[i][j]) fprintf(g,"%d %d\n",i,j-n1);
}
int bfs()
{
int p,u,i,x;
Q[0]=s;
p=u=0;
viz[s]=1;
while(p<=u && !viz[d])
{
x=Q[p++];
for(i=1; i<=n; i++)
if(!viz[i])
if(F[x][i]<C[x][i])
{
viz[i]=x;
Q[++u]=i;
}
else if (F[i][x]>0)
{
viz[i]=-x;
Q[++u]=i;
}
}
return !viz[d];
}