Pagini recente » Cod sursa (job #1590771) | Cod sursa (job #2304908) | Cod sursa (job #589316) | Cod sursa (job #2550076) | Cod sursa (job #194397)
Cod sursa(job #194397)
# include <stdio.h>
# define FIN "cc.in"
# define FOUT "cc.out"
# define MAXN 204
# define inf 0X3f3f3f3f
int N, i, j, first, last;
int cap[MAXN][MAXN];
int cost[MAXN][MAXN];
int coada[MAXN*MAXN];
int d[MAXN];
int T[MAXN];
unsigned char s[MAXN];
int bellman()
{
int nod;
s[0]=1;
coada[1]=0;
for (i = 1; i <= 2*N+1; ++i)
d[i]=inf;
d[0]=0;
T[0]=-1;
first=1; last=2;
while (first<last)
{
nod = coada[first];
s[nod]=0;
first++;
for (i = 0; i <= 2*N+1; ++i)
if (cap[nod][i]==1 && d[nod]+cost[nod][i]<d[i])
{
d[i]=d[nod]+cost[nod][i];
if (s[i]==0)
{
coada[last++]=i;
s[i]=1;
}
T[i]=nod;
}
}
if (d[2*N+1]==inf) return 0;
int aux;
aux=2*N+1;
while (T[aux]!=-1)
{
cap[T[aux]][aux]=0;
cap[aux][T[aux]]=1;
aux=T[aux];
}
return 1;
}
void flux()
{
int rez = 0;
while (bellman()==1);
for (i = 1; i <= N; ++i)
for (j = N+1; j <= 2*N+1; ++j)
if (cap[i][j]==0) rez+=cost[i][j];
printf("%d",rez);
}
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
scanf("%d",&N);
for (i = 1; i <= N; ++i)
for (j = N+1; j <= 2*N; ++j)
{
scanf("%d",&cost[i][j]);
cost[j][i]=-cost[i][j];
cap[i][j]=1;
}
for (i = 1; i <= N; ++i)
cap[0][i]=1;
for (i = N+1; i <= 2*N; ++i)
cap[i][2*N+1]=1;
flux();
return 0;
}