Pagini recente » Cod sursa (job #573089) | Cod sursa (job #1517868) | Cod sursa (job #2012451) | Monitorul de evaluare | Cod sursa (job #279871)
Cod sursa(job #279871)
#include<fstream.h>
#define INF 1000000
#define N 1000
#define maxim(x,y) ((x)>(y)?(x):(y));
#define minim(x,y) ((x)<(y)?(x):(y));
//using namespace std;
int c[N][N], flux, d[N], f[N][N], t[N], b[N], nr, n, m, i, j, ok, length,k,x1,y1;
void edmondsKarp();
int bf();
int main()
{
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
f>>n>>m>>k;
for(i = 1;i <= k; i++)
{
f>>x1>>y1;
c[x1][n+y1] = 1;
c[n+y1][x1] = 1;
}
for(i=1;i<=n;i++)
c[0][i] = 1;
for(i=n+1;i<=m+n;i++)
c[i][m+n+1] = 1;
edmondsKarp();
k = minim(n,m);
g<<k<<"\n";
k = maxim(n,m);
for(i=1;i<=k;i++)
if(b[i] != 0)
g<<i<<" "<<b[i]<<"\n";
return 0;
}
void edmondsKarp()
{
int min, drum[N],k;
do{
for(i=0; i<= m+n+1; i++)
d[i] = drum[i] = 0;
min = bf();
if(min > 0)
{
flux+=min;
i = m+n+1;
k = 0;
drum[++k] = i;
while(i>0)
{
j = t[i];
f[j][i] += min;
f[i][j] -= min;
drum[++k] = j;
i = j;
}
for(i=k;i>1;i--)
if(drum[i]>=1 && drum[i]<=n && drum[i-1] >= n+1 && drum[i-1] <= n+m)
b[drum[i]] = drum[i-1] - n;
}
}
while(min !=0);
}
int bf()
{
int coada[N],prim=1, ultim=1, nod_cur;
memset(coada, 0, sizeof(coada));
memset(t, -1, sizeof(t));
d[0] = INF;
while(prim <= ultim)
{
nod_cur = coada[prim];
for(i=0;i<=m+n+1;i++)
if(t[i]== -1 && c[nod_cur][i] - f[nod_cur][i] > 0)
{
coada[++ultim] = i;
t[i] = nod_cur;
if(d[nod_cur] < c[nod_cur][i] - f[nod_cur][i])
d[i] = d[nod_cur];
else
d[i] = c[nod_cur][i] - f[nod_cur][i];
if(i == m+n+1)
return d[m+n+1];
}
prim++;
}
return 0;
}