Pagini recente » Cod sursa (job #1654174) | Cod sursa (job #165243) | Cod sursa (job #1203174) | Cod sursa (job #430404) | Cod sursa (job #838719)
Cod sursa(job #838719)
# include <algorithm>
# include <cstdio>
# include <cstring>
# include <vector>
# include <queue>
using namespace std;
# define x first
# define y second
const char *FIN = "cc.in", *FOU = "cc.out";
const int MAX = 205, oo = 0x3f3f3f3f;
vector < pair <int, int> > G[MAX];
int A[MAX][MAX], C[MAX][MAX], F[MAX][MAX], dp[MAX], T[MAX], viz[MAX];
int N, S, D;
int cm;
struct comp {
bool operator () (const int &A, const int &B) {
return dp[A] > dp[B];
}
};
priority_queue < int, vector <int>, comp > Q ;
inline void getmin (int &a, int b) {
a = a < b ? a : b;
}
inline int dijkstra (void) {
memset (T, 0, sizeof (T)), memset (viz, 0, sizeof (viz)), memset (dp, oo, sizeof (dp));
dp[S] = 0;
for (Q.push (S); !Q.empty ();) {
int X = Q.top(); viz[X] = 0; Q.pop ();
for (vector < pair <int, int> > :: iterator it = G[X].begin (); it != G[X].end (); ++it)
if (dp[X] + it -> y < dp[it -> x] && C[X][it -> x] != F[X][it -> x]) {
dp[it -> x] = dp[X] + it -> y, T[it -> x] = X;
if (viz[it -> x] == 0)
viz[it -> x] = 1, Q.push (it -> x);
}
}
return dp[D] != oo;
}
int main (void) {
freopen (FIN, "r", stdin);
scanf ("%d", &N);
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
scanf ("%d", A[i] + j);
S = 0, D = 2 * N + 1;
for (int i = 1; i <= N; ++i) {
G[S].push_back (make_pair (i, 0));
G[i].push_back (make_pair (S, 0));
C[S][i] = 1;
G[i + N].push_back (make_pair (D, 0));
G[D].push_back (make_pair (i + N, 0));
C[i + N][D] = 1;
for (int j = 1; j <= N; ++j) {
G[i].push_back (make_pair (j + N, +A[i][j]));
G[j + N].push_back (make_pair (i, -A[i][j]));
C[i][j + N] = 1;
}
}
for (int fmin = 0; dijkstra (); cm += fmin * dp[D]) {
fmin = oo;
for (int i = D; i != S; i = T[i])
getmin (fmin, C[T[i]][i] - F[T[i]][i]);
for (int i = D; i != S; i = T[i])
F[T[i]][i] += fmin, F[i][T[i]] -= fmin;
}
fprintf (fopen (FOU, "w"), "%d", cm);
}