Pagini recente » Cod sursa (job #2304471) | Cod sursa (job #971377) | Cod sursa (job #1373270) | Cod sursa (job #2746600) | Cod sursa (job #303947)
Cod sursa(job #303947)
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define pb push_back
#define tr(C, i) for (typeof((C).begin()) i = (C).begin(); i != (C).end(); ++i)
typedef vector<int> VI;
typedef vector<VI> VVI;
const int oo = 1<<30;
int N, NN;
VVI G, C, W, F;
VI P, D;
bool bf(int S, int T) {
fill(P.begin(), P.end(), 0);
fill(D.begin(), D.end(), oo);
queue<int> Q;
Q.push(S);
P[S] = S;
D[S] = 0;
while (!Q.empty()) {
int u = Q.front();
Q.pop();
tr(G[u], vv) {
int v = *vv;
if ((C[u][v] - F[u][v] > 0) && (D[u] + W[u][v] < D[v])) {
P[v] = u;
D[v] = D[u] + W[u][v];
Q.push(v);
}
}
}
return (P[T] != 0);
}
int main(int argc, char *argv[]) {
int S, T;
ifstream fin("cc.in");
fin >> N;
S = 0;
NN = 2*N + 2;
T = NN-1;
G.resize(NN);
C.resize(NN);
fill(C.begin(), C.end(), VI(NN, 0));
W.resize(NN);
fill(W.begin(), W.end(), VI(NN, 0));
for (int v = 1; v <= N; ++v) {
G[S].pb(v);
C[S][v] = 1;
W[S][v] = 0;
int vv = v+N;
G[vv].pb(T);
C[vv][T] = 1;
W[vv][T] = 0;
}
for (int u = 1; u <= N; ++u)
for (int v = N+1; v <= 2*N; ++v) {
fin >> W[u][v];
W[v][u] = -W[u][v];
G[u].pb(v);
C[u][v] = 1;
G[v].pb(u);
}
fin.close();
F.resize(NN);
fill(F.begin(), F.end(), VI(NN, 0));
P.resize(NN);
D.resize(NN);
int ct = 0;
while (bf(S, T)) {
int fmin = oo;
for (int n = T; P[n] != n; n = P[n])
fmin = min(fmin, C[P[n]][n] - F[P[n]][n]);
for (int n = T; P[n] != n; n = P[n]) {
F[P[n]][n] += fmin;
F[n][P[n]] -= fmin;
}
ct += fmin * D[T];
}
ofstream fout("cc.out");
fout << ct << endl;
fout.close();
return 0;
}