Pagini recente » Cod sursa (job #2492698) | Cod sursa (job #676316) | Cod sursa (job #2145285) | Cod sursa (job #931841) | Cod sursa (job #57092)
Cod sursa(job #57092)
#include<stdio.h>
#define INF 1000000000
FILE *fi,*fo;
long n,n1,n2,m,i,j;
long x,y,expense;
long C[203][203],E[203][203],A[203][203];
long P[203],V[203];
long suma(long, long);
long min(long, long);
void Bellman();
void flux();
int main()
{
fi=fopen("cc.in","rt");
fscanf(fi,"%ld",&n);
// 0 este sursa
// n+1 este destinatia
// n1 este numarul de varfuri din V1
// n2 este numarul de varfuri din V2
// m este numarul de arce de la V1 la V2
n1=n;
n2=n;
m=n*n;
n=n1+n2;
for (i=0;i<=n+1;i++)
for (j=0;j<=n+1;j++)
{
C[i][j]=0;
E[i][j]=INF;
}
for (i=1;i<=n1;i++)
for (j=1;j<=n1;j++)
{
fscanf(fi,"%ld",&expense);
C[i][j+n1]=1;
E[i][j+n1]=expense;
}
fclose(fi);
for (i=1;i<=n1;i++)
{
C[0][i]=1;
E[0][i]=0;
}
for (i=n1+1;i<=n;i++)
{
C[i][n+1]=1;
E[i][n+1]=0;
}
flux();
long sum=0;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (C[j][i]>0 && E[i][j]<INF)
sum+=E[i][j];
fo=fopen("cc.out","wt");
fprintf(fo,"%ld",sum);
fclose(fo);
return 0;
}
long suma(long a, long b)
{
if (a==INF || b==INF)
return INF;
return a+b;
}
long min(long a, long b)
{
if (a<=b)
return a;
return b;
}
void Bellman()
{
long i,j,t;
for (i=0;i<=n+1;i++)
for (j=0;j<=n+1;j++)
if (i==j)
A[i][j]=0;
else
A[i][j]=INF;
for (i=0;i<=n+1;i++)
for (j=0;j<=n+1;j++)
if (E[i][j]<INF)
{
if (C[i][j]>0)
A[i][j]=E[i][j];
if (C[j][i]>0)
A[j][i]=-E[i][j];
}
for (i=0;i<=n+1;i++)
{
P[i]=-1;
V[i]=INF;
}
V[0]=0;
do
{
t=1;
for (i=0;i<=n+1;i++)
for (j=0;j<=n+1;j++)
if (suma(V[i],A[i][j])<V[j] && C[i][j]>0)
{
t=0;
V[j]=suma(V[i],A[i][j]);
P[j]=i;
}
}
while (t==0);
}
void flux()
{
long i,eps;
while (1)
{
Bellman();
if (P[n+1]==-1)
return;
eps=INF;
for (i=n+1;i!=0;i=P[i])
eps=min(eps,C[P[i]][i]);
for (i=n+1;i!=0;i=P[i])
{
C[P[i]][i]-=eps;
C[i][P[i]]+=eps;
}
}
}