Pagini recente » Cod sursa (job #943746) | Cod sursa (job #1490247) | Cod sursa (job #384479) | Organizatori preONI 2007 | Cod sursa (job #712942)
Cod sursa(job #712942)
#include <fstream>
#include <vector>
#include <set>
#define DIM 203
#define INF 0x3f3f3f3f
using namespace std;
int n, S, D, cost_tot;
int c[DIM][DIM], cost[DIM][DIM], f[DIM][DIM];
vector<int> t;
void EK();
void Augment();
bool Dijkstra();
void Build();
void Read();
void Write();
void Build();
int main()
{
Read();
EK();
Write();
return 0;
}
void Read()
{
ifstream fin("cc.in");
fin >> n;
int val;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
{
fin >> val;
cost[i][j+n] = val;
cost[j+n][i] = val * (-1);
c[i][j+n] = 1;
c[j+n][i] = 0;
}
fin.close();
}
void EK()
{
Build();
while (Dijkstra())
Augment();
}
void Build()
{
S = 0; D = 2 * n + 1;
for (int i = 1; i <= n; ++i)
{
c[S][i] = 1; c[i][S] = 0;
c[i+n][D] = 1; c[D][i+n] = 0;
}
}
bool Dijkstra()
{
t.assign(D+1, 0);
set<pair<int, int> > T;
vector<int> d(D+1, INF);
d[S] = 0;
T.insert(make_pair(0, S));
while (!T.empty())
{
set<pair<int, int> >::iterator it = T.begin();
int val = it->first;
int nod = it->second;
T.erase(it);
for (int i = S; i <= D; ++i)
{
if (nod == i) continue;
if (c[nod][i] > f[nod][i] && d[i] > d[nod] + cost[nod][i])
{
d[i] = d[nod] + cost[nod][i];
t[i] = nod;
T.insert(make_pair(d[i], i));
}
}
}
if (d[D] != INF)
return true;
return false;
}
void Augment()
{
int i, j = D;
while (j != S)
{
i = t[j];
f[i][j]++;
f[j][i]--;
cost_tot += cost[i][j];
j = i;
}
}
void Write()
{
ofstream fout("cc.out");
fout << cost_tot << '\n';
fout.close();
}