結果

問題 No.421 しろくろチョコレート
ユーザー xuzijian629
提出日時 2018-11-07 01:39:04
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 36 ms / 2,000 ms
コード長 3,444 bytes
コンパイル時間 1,861 ms
コンパイル使用メモリ 204,380 KB
最終ジャッジ日時 2025-01-06 15:42:15
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 65
権限があれば一括ダウンロードができます

ソースコード

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

#include <bits/stdc++.h>
using namespace std;
using i64 = int64_t;
using vi = vector<i64>;
using vvi = vector<vi>;
//
class Hungarian {
int n, p, q;
vvi mat;
vi fx, fy, x, y;
const i64 INF = 1e9;
public:
Hungarian(const vvi& mat) : mat(mat) {
n = mat.size();
fx.assign(n, INF);
fy.assign(n, 0);
x.assign(n, -1);
y.assign(n, -1);
}
i64 run() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
fx[i] = max(fx[i], mat[i][j]);
}
}
for (int i = 0; i < n;) {
vi t(n, -1), s(n + 1, i);
for (p = q = 0; p <= q && x[i] < 0; p++) {
for (int k = s[p], j = 0; j < n && x[i] < 0; j++) {
if (fx[k] + fy[j] == mat[k][j] && t[j] < 0) {
s[++q] = y[j];
t[j] = k;
if (s[q] < 0) {
for (p = j; p >= 0; j = p) {
y[j] = k = t[j];
p = x[k];
x[k] = j;
}
}
}
}
}
if (x[i] < 0) {
i64 d = INF;
for (int k = 0; k <= q; k++) {
for (int j = 0; j < n; j++) {
if (t[j] < 0) {
d = min(d, fx[s[k]] + fy[j] - mat[s[k]][j]);
}
}
}
for (int j = 0; j < n; j++) {
fy[j] += (t[j] < 0 ? 0 : d);
}
for (int k = 0; k <= q; k++) {
fx[s[k]] -= d;
}
} else {
i++;
}
}
i64 ret = 0;
for (int i = 0; i < n; i++) {
ret += mat[i][x[i]];
}
return ret;
}
int match_y(int k) {
return x[k];
}
int match_x(int k) {
return y[k];
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cout.setf(ios::fixed);
cout.precision(10);
int n, m;
cin >> n >> m;
vvi b(n, vi(m, -1));
int wcnt = 0, bcnt = 0;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
for (int j = 0; j < m; j++) {
if (s[j] == 'w') {
b[i][j] = wcnt++;
} else if (s[j] == 'b') {
b[i][j] = 10000 + bcnt++;
}
}
}
int k = max(wcnt, bcnt);
vvi mat(k, vi(k));
auto is_next = [](int i, int j, int ii, int jj) {
return abs(i - ii) + abs(j - jj) == 1;
};
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
for (int ii = 0; ii < n; ii++) {
for (int jj = 0; jj < m; jj++) {
if (0 <= b[i][j] && b[i][j] < 10000 && 10000 <= b[ii][jj]) {
if (is_next(i, j, ii, jj)) {
mat[b[i][j]][b[ii][jj] - 10000] = 100;
} else {
mat[b[i][j]][b[ii][jj] - 10000] = 10;
}
}
}
}
}
}
Hungarian h(mat);
cout << h.run() + abs(wcnt - bcnt) << endl;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0