Pagini recente » Cod sursa (job #246969) | Cod sursa (job #90751) | Cod sursa (job #1145917) | Cod sursa (job #178002) | Cod sursa (job #191414)
Cod sursa(job #191414)
#include <iostream>
#include <fstream>
using namespace std;
const int oo = 0x3f3f3f3f;
const int MOD = 500;
int N;
int C[201][201];
bool R[201][201];
int V[201];
int up[201];
bool U[201];
int D[201];
int q[MOD];
bool inq[MOD];
int begq, endq;
int src, dest;
void printM()
{
for (int i(0); i <= 2*N+1; ++i) {
for (int j(0); j <= 2*N+1; ++j)
cout << R[i][j] << " ";
cout << endl;
}
cout << endl;
}
/*
bool augment()
{
memset(U, 0, sizeof(U));
memset(D, 0x3f, sizeof(D));
D[src] = 0;
while (true) {
int min = oo;
int pos = -1;
for (int i(0); i <= dest; ++i)
if ((min > D[i]) && !U[i]) {
min = D[i];
pos = i;
}
if (pos == -1)
break;
U[pos] = true;
for (int i(0); i <= dest; ++i)
if ((D[i] > D[pos] + C[pos][i] + V[pos] - V[i]) && R[pos][i]) {
D[i] = D[pos] + C[pos][i] + V[pos] - V[i];
up[i] = pos;
}
}
for (int i(0); i <= dest; ++i)
V[i] += D[i];
return D[dest] != oo;
}*/
bool augment()
{
memset(inq, 0, sizeof(inq));
memset(D, 0x3f, sizeof(D));
begq = endq = 0;
inq[src] = true;
D[src] = 0;
q[endq++] = src;
while (begq != endq) {
int pos = q[begq];
for (int i(0); i <= dest; ++i)
if ((D[i] > D[pos] + C[pos][i] + V[pos] - V[i]) && R[pos][i]) {
D[i] = D[pos] + C[pos][i] + V[pos] - V[i];
up[i] = pos;
if (!inq[i]) {
inq[i] = true;
q[endq] = i;
endq = (endq + 1) % MOD;
}
}
inq[pos] = false;
begq = (begq + 1) % MOD;
}
for (int i(0); i <= dest; ++i)
V[i] += D[i];
return D[dest] != oo;
}
int main(int argc, char *argv[])
{
FILE *fi = fopen("cc.in", "r");
fscanf(fi, "%d", &N);
for (int i(1); i <= N; ++i)
for (int j = N+1; j <= 2*N; ++j) {
fscanf(fi, "%d", &C[i][j]);
C[j][i] = -C[i][j];
R[i][j] = true;
}
fclose(fi);
src = 0;
dest = 2*N+1;
for (int i(1); i <= N; ++i)
R[src][i] = true;
for (int i = N+1; i <= 2*N; ++i)
R[i][dest] = true;
int res(0);
while (augment()) {
for (int i = dest; i != src; i = up[i]) {
R[up[i]][i] = false;
R[i][up[i]] = true;
}
res += V[dest];
}
ofstream fout("cc.out");
fout << res << endl;
fout.close();
return 0;
}