Pagini recente » Cod sursa (job #741211) | Cod sursa (job #2254455) | Cod sursa (job #2208680) | Cod sursa (job #2475720) | Cod sursa (job #133473)
Cod sursa(job #133473)
#include <cstdio>
#include <vector>
#include <queue>
#define dim 202
#define pb push_back
#define mp make_pair
using namespace std;
int N, S;
int T[dim], D[dim], F[dim][dim], C[dim][dim];
vector < pair <int, int> > G[dim];
queue <int> Q;
int Bellman()
{
Q.push(0);
for(int i=1; i<=N; ++i)
{
T[i] = 0;
D[i] = 0x3f3f3f3f;
}
T[0] = D[0] = 0;
while(Q.empty() == false)
{
int nd = Q.front();
Q.pop();
for(vector < pair < int, int > > :: iterator it=G[nd].begin(); it!=G[nd].end(); ++it)
{
int nnd = it -> first;
int c = it -> second;
if(F[nd][nnd] < C[nd][nnd] && D[nnd] > D[nd] + c)
{
D[nnd] = D[nd] + c;
T[nnd] = nd;
Q.push(nnd);
}
}
}
return T[N] != 0;
}
void Read()
{
freopen("cc.in", "rt", stdin);
int i, j, c;
for(scanf("%d", &N), i=1; i<=N; ++i)
{
G[0].pb(mp(i, 0));
G[i].pb(mp(0, 0));
C[0][i] = 1;
G[N+i].pb(mp(2*N+1, 0));
G[2*N+1].pb(mp(N+i, 0));
C[N+i][2*N+1] = 1;
for(j=1; j<=N; ++j)
{
scanf("%d", &c);
C[i][N+j] = 1;
G[i].pb(mp(N+j, c));
G[N+j].pb(mp(i, -c));
}
}
fclose(stdin);
}
void Flow()
{
N = 2 * N + 1;
while(Bellman())
{
int i, r = 0x3f3f3f3f;
for(i=N; i; i=T[i])
if(C[T[i]][i] - F[T[i]][i] < r)
r = C[T[i]][i] - F[T[i]][i];
if(!r) continue;
for(i=N; i; i=T[i])
{
F[T[i]][i] += r;
F[i][T[i]] -= r;
}
S += D[N];
}
}
void Write()
{
freopen("cc.out", "wt", stdout);
printf("%d", S);
fclose(stdout);
}
int main()
{
Read();
Flow();
Write();
return 0;
}