Pagini recente » Cod sursa (job #1864568) | Cod sursa (job #661008) | Cod sursa (job #1507891) | Cod sursa (job #2272785) | Cod sursa (job #592914)
Cod sursa(job #592914)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define maxn 210
#define inf 1000000000
int n, i, j, k, ok, sol;
int c[maxn][maxn], f[maxn][maxn];
int q[maxn], fol[maxn], dist[maxn], t[maxn];
vector<int> v[maxn], cs[maxn];
void add(int a, int b, int cap, int cost)
{
c[a][b]=cap;
v[a].push_back(b);
v[b].push_back(a);
cs[a].push_back(cost);
cs[b].push_back(-cost);
}
int bf()
{
int nod, fiu, r=1, flux=inf;
memset(t, 0, sizeof(t));
memset(fol, 0, sizeof(fol));
for(int i=1; i<=2*n+2; ++i)
dist[i]=inf;
dist[1]=0;
q[1]=1;
fol[1]=1;
for(int i=1; i<=r; ++i)
{
nod=q[i%maxn];
fol[nod]=0;
for(int j=0; j<v[nod].size(); ++j)
{
fiu=v[nod][j];
if(c[nod][fiu]-f[nod][fiu]>0 && dist[nod]+cs[nod][j]<dist[fiu])
{
dist[fiu]=dist[nod]+cs[nod][j];
t[fiu]=nod;
if(fol[fiu]==0)
{
fol[fiu]=1;
q[(++r)%maxn]=fiu;
}
}
}
}
if(dist[2*n+2]==inf)
return 0;
ok=1;
nod=2*n+2;
while(t[nod]!=0)
{
flux=min(flux, c[t[nod]][nod]-f[t[nod]][nod]);
nod=t[nod];
}
nod=2*n+2;
while(t[nod]!=0)
{
f[t[nod]][nod]+=flux;
f[nod][t[nod]]-=flux;
nod=t[nod];
}
return flux*dist[2*n+2];
}
int main()
{
freopen("cc.in", "r", stdin);
freopen("cc.out", "w", stdout);
scanf("%d", &n);
for(int i=1; i<=n; ++i)
{
add(1, i+1, 1, 0);
add(1+n+i, 2*n+2, 1, 0);
for(int j=1; j<=n; ++j)
{
scanf("%d", &k);
add(i+1, n+j+1, 1, k);
}
}
ok=1;
while(ok)
{
ok=0;
sol+=bf();
}
printf("%d\n", sol);
return 0;
}