Pagini recente » Cod sursa (job #2939961) | Cod sursa (job #3219228) | Cod sursa (job #2913315) | Cod sursa (job #1304027) | Cod sursa (job #2179633)
#include <bits/stdc++.h>
using namespace std;
ifstream f("pixels.in");
ofstream g("pixels.out");
const int MaxN = 105;
int n, from[MaxN * MaxN], S, D, added;
bool viz[MaxN * MaxN];
vector<pair<int, int> > gr[MaxN * MaxN];
inline int node(int i, int j) {
return (i - 1) * n + j;
}
inline void muchie(int a, int b, int c) {
gr[a].push_back({b, c});
gr[b].push_back({a, -c});
}
inline void muchie2(int a, int b, int c) {
gr[a].push_back({b, c});
gr[b].push_back({a, c});
}
inline int getcap(int a, int b) {
int A = gr[a].size();
for (int i = 0; i < A; ++i)
if (gr[a][i].first == b) return gr[a][i].second;
return 0;
}
bool bfs()
{
queue<int> q;
memset(from, 0, sizeof(from));
memset(viz, 0, sizeof(viz));
viz[S] = 1;
q.push(S);
while (!q.empty() && !viz[D])
{
int node = q.front();
q.pop();
for (auto son: gr[node])
{
if (!viz[son.first] && getcap(node, son.first) > 0)
{
viz[son.first] = 1;
q.push(son.first);
from[son.first] = node;
}
}
}
if (viz[D]) return 1;
return 0;
}
int main()
{
f >> n;
S = n * n + 1;
D = n * n + 2;
int sum = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
int a;
f >> a;
muchie(S, node(i, j), a);
sum += a;
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
int a;
f >> a;
muchie(node(i, j), D, a);
sum += a;
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
int a;
f >> a; f >> a;
if (j < n) muchie2(node(i, j), node(i, j + 1), a);
f >> a;
if (i < n) muchie2(node(i, j), node(i + 1, j), a);
f >> a;
}
}
int maxfl = 0;
while (bfs())
{
for (int i = 1; i < D; ++i)
if (from[i] && getcap(i, D))
{
added = getcap(i, D);
from[D] = i;
int node = D;
while (from[node])
{
added = min(added, getcap(from[node], node));
node = from[node];
}
node = D;
while (from[node])
{
int sz = gr[from[node]].size();
for (int i = 0; i < sz; ++i) if (gr[from[node]][i].first == node) {
gr[from[node]][i].second -= added;
}
sz = gr[node].size();
for (int i = 0; i < sz; ++i) if (gr[from[node]][i].first == from[node]) {
gr[node][i].second += added;
}
node = from[node];
}
maxfl += added;
}
}
g << sum - maxfl << ' ';
return 0;
}