Pagini recente » Cod sursa (job #2681982) | Cod sursa (job #1346827) | Cod sursa (job #2310947) | Cod sursa (job #1548839) | Cod sursa (job #309933)
Cod sursa(job #309933)
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;
#define NUME "cc"
ifstream fi(NUME".in");
ofstream fo(NUME".out");
#define MAXN 210
#define INF 0x3f3f3f3f
int G[MAXN][MAXN], N, S, D;
int F[MAXN][MAXN], C[MAXN][MAXN];
int Dist[MAXN], T[MAXN], U[MAXN], inque[MAXN];
#define avail(i, j) (C[i][j] - F[i][j])
int bellman(int S, int D)
{
memset(Dist, INF, sizeof(T));
memset(U, 0, sizeof(T));
memset(inque, 0, sizeof(T));
queue<int> Q;
Q.push(S);
Dist[S] = 0;
while (!Q.empty()) {
int x = Q.front();
U[x] ++;
Q.pop(); inque[x] = 0;
if (U[x] == N) // ciclu
return INF;
for (int i = 0; i <= 2*N+1; ++i) {
if (!C[x][i]) continue;
if (avail(x, i) > 0 && Dist[i] > Dist[x] + G[x][i]) {
Dist[i] = Dist[x] + G[x][i];
T[i] = x;
if (inque[i] == 0)
inque[i] = 1, Q.push(i);
}
}
}
return Dist[D];
}
void fmcm()
{
int f, c, r, dist, i;
for (f = c = 0; (dist = bellman(S, D)) != INF; f += r, c += r*dist) {
r = INF;
for (i = D; i != S; i = T[i])
r = min(r, avail(T[i], i));
for (i = D; i != S; i = T[i])
F[ T[i] ][i] += r, F[i][ T[i] ] -= r;
}
fo << c << "\n";
}
int main()
{
int i, j;
fi >> N;
S = 0; D = 2*N + 1;
for (i = 1; i <= N; ++i) {
C[S][i] = 1;
C[N+i][D] = 1;
for (j = 1; j <= N; ++j) {
fi >> G[i][N+j];
G[N+j][i] = - G[i][N+j];
C[i][N+j] = 1;
}
}
fmcm();
return 0;
}