Pagini recente » Monitorul de evaluare | Cod sursa (job #20548) | Istoria paginii runda/puh | Cod sursa (job #2956795) | Cod sursa (job #772719)
Cod sursa(job #772719)
#include <cstring>
#include <fstream>
#include <algorithm>
#include <queue>
using namespace std;
const int oo = 0x3f3f3f3f;
int N, Cost[205][205];
int F[205][205], C[205][205];
queue<int> Q;
int Dist[205], Dad[205];
bool Incr[205];
int minC;
bool BellmanFord();
int main()
{
ifstream In("cc.in");
ofstream Out("cc.out");
In >> N;
for (int i = 1; i <= N; ++i)
for (int j = 1, cost; j <= N; ++j)
{
In >> cost;
Cost[i][N + j] = cost;
Cost[N + j][i] = -cost;
C[i][N + j] = 1;
}
for (int i = 1; i <= N; ++i)
{
C[0][i] = 1;
C[N + i][2 * N + 1] = 1;
}
while (BellmanFord());
Out << minC;
In.close();
Out.close();
}
bool BellmanFord()
{
for (int i = 1; i <= 2 * N + 1; ++i)
Dist[i] = oo;
Dist[0] = 0;
Q.push(0);
while (!Q.empty())
{
int now = Q.front(); Q.pop();
Incr[now] = false;
for (int i = 1; i <= 2 * N + 1; ++i)
if (F[now][i] < C[now][i] && Dist[now] + Cost[now][i] < Dist[i])
{
Dist[i] = Dist[now] + Cost[now][i];
Dad[i] = now;
if (!Incr[i])
{
Incr[i] = true;
Q.push(i);
}
}
}
if (Dist[2 * N + 1] == oo) return false;
for (int i = 2 * N + 1; i != 0; i = Dad[i])
++F[Dad[i]][i], --F[i][Dad[i]];
minC += Dist[2 * N + 1];
return true;
}