Pagini recente » Cod sursa (job #2461551) | Cod sursa (job #3124298) | Cod sursa (job #508435) | Cod sursa (job #1599083) | Cod sursa (job #360726)
Cod sursa(job #360726)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define file_in "cc.in"
#define file_out "cc.out"
#define Inf 0x3f3f3f3f
#define Nmax 220
#define pb push_back
int n,m,C[Nmax][Nmax],P[Nmax][Nmax],F[Nmax][Nmax],viz[Nmax*Nmax],dm[Nmax*Nmax],s,d,t[Nmax*Nmax],q[Nmax*Nmax];
void citire()
{
int x,y,c,f,i,j;
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d", &n);
s=0;
d=2*n+1;
for (i=1;i<=n;++i)
for (j=n+1;j<d;++j)
{
scanf("%d", &P[i][j]);
P[j][i]=-P[i][j];
C[i][j]=1;
}
for (i=1;i<=n;++i)
{
C[s][i]=1;
C[i+n][d]=1;
}
}
inline int bf()
{
for (int i=s;i<=d;++i)
dm[i]=Inf,
viz[i]=0;
int st=0,dr=1, nod;
q[1]=s;
dm[s]=0;
viz[s]=1;
while (st<dr)
{
nod=q[++st];
for (int i=s;i<=d;++i)
if ((dm[nod]+P[nod][i]<dm[i]) && (C[nod][i]-F[nod][i]>0))
{
dm[i]=dm[nod]+P[nod][i];
t[i]=nod;
if (!viz[i])
{
q[++dr]=i;
viz[i]=1;
}
}
viz[nod]=0;
}
return (dm[d]<Inf/2);
}
void solve()
{
int sol=0;
while (bf())
{
int r=C[t[d]][d]-F[t[d]][d];
for (int i=d;i!=s;i=t[i])
if (C[t[i]][i]-F[t[i]][i]<r)
r=C[t[i]][i]-F[t[i]][i];
for (int i=d;i!=s;i=t[i])
F[t[i]][i]+=r,
F[i][t[i]]-=r;
sol+=r*dm[d];
}
printf("%d", sol);
}
int main()
{
citire();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}