Pagini recente » Cod sursa (job #4923) | Cod sursa (job #2549770) | Cod sursa (job #2749889) | Cod sursa (job #2635353) | Cod sursa (job #585263)
Cod sursa(job #585263)
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
#define nmax 210
#define inf 1<<30
int n, u[nmax], dist[nmax], t[nmax], s, d, sol, c[nmax][nmax], cost[nmax][nmax], f[nmax][nmax];
vector <int> g[nmax];
queue <int> q;
int bellmanford()
{
int i, nod, v;
for (i=0; i<=d; i++)
{
u[i]=0;
dist[i]=inf;
}
q.push(s);
dist[s]=0;
u[s]=1;
while (!q.empty())
{
nod=q.front();
q.pop();
u[nod]=0;
for (i=0; i<g[nod].size(); i++)
{
v=g[nod][i];
if (c[nod][v]!=f[nod][v])
if (dist[nod]+cost[nod][v]<dist[v])
{
dist[v]=dist[nod]+cost[nod][v];
t[v]=nod;
if (!u[v])
{
q.push(v);
u[v]=1;
}
}
}
}
return dist[d];
}
int main()
{
freopen("cc.in","r",stdin);
freopen("cc.out","w",stdout);
scanf("%d", &n);
int i, j, nod, x, fm;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{
c[i][n+j]=inf;
scanf("%d", &cost[i][n+j]);
cost[n+j][i]=-cost[i][n+j];
g[i].push_back(j+n);
g[j+n].push_back(i);
}
s=0;
d=2*n+1;
for (i=1; i<=n; i++)
{
c[s][i]=1;
g[s].push_back(i);
g[i].push_back(s);
}
for (i=n+1; i<=2*n; i++)
{
c[i][d]=1;
g[i].push_back(d);
g[d].push_back(i);
}
while ((x=bellmanford())!=inf)
{
fm=5;
nod=d;
while (nod)
{
fm=min(fm, c[t[nod]][nod]-f[t[nod]][nod]);
nod=t[nod];
}
nod=d;
while (nod)
{
f[t[nod]][nod]+=fm;
f[nod][t[nod]]-=fm;
nod=t[nod];
}
sol+=x;
}
printf("%d\n",sol);
}