結果

問題 No.957 植林
ユーザー niuez
提出日時 2020-05-09 09:55:38
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 3,733 bytes
コンパイル時間 1,843 ms
コンパイル使用メモリ 182,524 KB
実行使用メモリ 82,548 KB
最終ジャッジ日時 2024-07-05 06:09:42
合計ジャッジ時間 18,897 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2 WA * 1
other AC * 44 WA * 1
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <vector>
#include <iostream>
struct goldberg_tarjan {
using cap_type = long long;
struct edge {
int to;
cap_type cap;
int rev;
edge(int t, cap_type c, int r): to(t), cap(c), rev(r) {}
};
int N;
std::vector<std::vector<edge>> G;
std::vector<cap_type> exc;
std::vector<int> h;
std::vector<std::vector<int>> que;
std::vector<int> qi;
const cap_type INF = 1e18;
goldberg_tarjan(int n): N(n), G(n) {}
void add_edge(int from, int to, cap_type cap, cap_type rev_cap = 0) {
G[from].emplace_back(to, cap, (int)(G[to].size()));
G[to].emplace_back(from, rev_cap, (int)(G[from].size() - 1));
}
void push(int from, edge& e) {
cap_type fl = std::min(exc[from], e.cap);
e.cap -= fl;
G[e.to][e.rev].cap += fl;
exc[from] -= fl;
exc[e.to] += fl;
}
void relabel(int v) {
h[v] = N - 1;
for(const auto& e: G[v]) {
if(e.cap > 0 && h[v] > h[e.to]) {
h[v] = h[e.to];
}
}
h[v]++;
}
std::vector<int> Q;
int global_relabeling(int t) {
for(int i = 0;i < N;i++) {
que[i].clear();
qi[i] = 0;
}
int i = 0, qr = 0;
Q[qr++] = t;
h.assign(N, N - 1);
h[t] = 0;
int hi = 0;
while(i < qr) {
int v = Q[i++];
hi = h[v];
if(exc[v] > 0 && v != t) {
que[h[v]].push_back(v);
}
for(const auto& e: G[v]) {
if(G[e.to][e.rev].cap > 0 && h[v] + 1 < h[e.to]) {
h[e.to] = h[v] + 1;
Q[qr++] = e.to;
}
}
}
return hi;
}
cap_type max_flow(int s, int t) {
exc.assign(N, 0);
exc[s] = INF;
h.assign(N, 0);
Q.resize(N);
int cnt = 0;
que.assign(N, std::vector<int>());
qi.assign(N, 0);
global_relabeling(t);
for(int di = h[s]; di >= 0;) {
if(qi[di] == que[di].size()) { di--; continue; }
int v = que[di][qi[di]++];
if(exc[v] == 0 || v == t) continue;
for(auto& e: G[v]) {
if(e.cap > 0 && h[v] == h[e.to] + 1) {
push(v, e);
if(exc[e.to] > 0 && e.to != t) {
que[h[e.to]].push_back(e.to);
}
}
}
if(exc[v] == 0) continue;
relabel(v);
if(h[v] < N) {
di = h[v];
que[h[v]].push_back(v);
}
if(++cnt % N == 0) {
di = global_relabeling(t);
}
}
return exc[t];
}
};
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
#define rep(i,s,e) for(i64 (i) = (s);(i) < (e);(i)++)
#define all(x) x.begin(),x.end()
template<class T>
static inline std::vector<T> ndvec(size_t&& n, T val) noexcept {
return std::vector<T>(n, std::forward<T>(val));
}
template<class... Tail>
static inline auto ndvec(size_t&& n, Tail&&... tail) noexcept {
return std::vector<decltype(ndvec(std::forward<Tail>(tail)...))>(n, ndvec(std::forward<Tail>(tail)...));
}
template<class T, class Cond>
struct chain {
Cond cond; chain(Cond cond) : cond(cond) {}
bool operator()(T& a, const T& b) const {
if(cond(a, b)) { a = b; return true; }
return false;
}
};
template<class T, class Cond>
chain<T, Cond> make_chain(Cond cond) { return chain<T, Cond>(cond); }
int main() {
cin.tie(nullptr);
std::ios::sync_with_stdio(false);
int H, W;
cin >> H >> W;
goldberg_tarjan gt(H + W + 2);
int s = H + W;
int t = s + 1;
vector<i64> A(H, 0);
rep(i,0,H) rep(j,0,W) {
i64 g;
cin >> g;
A[i] += g;
gt.add_edge(i, H + j, g);
}
i64 sum = 0;
rep(i,0,H) {
i64 r;
cin >> r;
i64 MIN = std::min(A[i], r);
sum += r - MIN;
gt.add_edge(s, i, A[i] - MIN);
}
rep(i,0,W) {
i64 r;
cin >> r;
sum += r;
gt.add_edge(H + i, t, r);
}
cout << sum - gt.max_flow(s, t) << "\n";
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0