Pagini recente » Cod sursa (job #2322461) | Cod sursa (job #1839270) | Cod sursa (job #2853078) | Cod sursa (job #1686558) | Cod sursa (job #299782)
Cod sursa(job #299782)
#include<stdio.h>
#include<vector>
#define MAXN 220
#define INF 1000000
#define pb push_back
#define sz size
#define S 205
#define D 206
using namespace std;
int n,i,j,fmin,x,sol;
int cost[MAXN][MAXN],c[MAXN][MAXN];
int tata[MAXN],dist[MAXN];
vector <int> a[MAXN];
int bf()
{
int i,p,u,X,Y;
int Q[MAXN*10],inq[MAXN];
for(i=0;i<=D;i++)
{
dist[i]=INF;
inq[i]=0;
tata[i]=0;
}
p=u=1;
Q[1]=S;
dist[S]=0;
tata[S]=S;
inq[S]=1;
for(;p<=u;p++)
{
X=Q[p];
for(i=0;i<a[X].size();i++)
{
Y=a[X][i];
if(c[X][Y] && dist[X] + cost[X][Y] < dist[Y])
{
dist[Y] = dist[X] + cost[X][Y];
tata[Y] = X;
if(!inq[Y])
{
Q[++u]=Y;
inq[Y]=1;
}
}
}
inq[X]=0;
}
if(dist[D]!=INF)
return 1;
return 0;
}
int main(void)
{
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
a[S].pb(i);
a[i].pb(S);
c[S][i]=1;
for(j=n+1;j<=2*n;j++)
{
scanf("%d",&cost[i][j]);
cost[j][i] -= cost[i][j];
c[i][j]=1;
a[i].pb(j);
a[j].pb(i);
}
}
for(i=n+1;i<=2*n;i++)
{
c[i][D]=1;
a[D].pb(i);
a[i].pb(D);
}
while(bf())
{
fmin=INF;
x=D;
while(x!=S)
{
fmin=min(fmin, c[tata[x]][x]);
x=tata[x];
}
x=D;
while(x!=S)
{
c[tata[x]][x]-=fmin;
c[x][tata[x]]+=fmin;
x=tata[x];
}
sol+=fmin*dist[D];
}
printf("%d\n",sol);
return 0;
}