結果
| 問題 |
No.421 しろくろチョコレート
|
| コンテスト | |
| ユーザー |
hipokaba
|
| 提出日時 | 2016-09-12 02:03:03 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,764 bytes |
| コンパイル時間 | 626 ms |
| コンパイル使用メモリ | 53,716 KB |
| 最終ジャッジ日時 | 2024-11-14 19:49:20 |
| 合計ジャッジ時間 | 1,211 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
main.cpp:16:1: error: ‘vector’ does not name a type
16 | vector<E> g[2502];
| ^~~~~~
main.cpp: In function ‘void add_edge(int, int)’:
main.cpp:24:9: error: ‘g’ was not declared in this scope
24 | g[f].push_back({t, 1, (int)g[t].size()});
| ^
main.cpp: In function ‘int dfs(int, int, int)’:
main.cpp:64:19: error: ‘g’ was not declared in this scope
64 | for(E& e: g[v]){
| ^
ソースコード
#include <iostream>
#include <algorithm>
#define rep(i, n) for(int i = 0; i < (n); ++i)
using namespace std;
const int inf = 1e4;
struct E{
int t, c, r;
};
int n, m;
string s[50];
vector<E> g[2502];
bool u[2502];
int encode(int i, int j){
return i * m + j;
}
void add_edge(int f, int t){
g[f].push_back({t, 1, (int)g[t].size()});
g[t].push_back({f, 0, (int)g[f].size() - 1});
}
void make_graph(){
rep(i, n){
rep(j, m){
if(s[i][j] == 0){
add_edge(encode(n, 0) ,encode(i, j));
}
else if(s[i][j] == 1){
add_edge(encode(i, j), encode(n, 1));
}
if(i + 1 < n && s[i][j] + s[i + 1][j] == 1){
int p = encode(i, j), q = encode(i + 1, j);
if(s[i][j] == 0){
add_edge(p, q);
}
else{
add_edge(q, p);
}
}
if(j + 1 < m && s[i][j] + s[i][j + 1] == 1){
int p = encode(i, j), q = encode(i, j + 1);
if(s[i][j] == 0){
add_edge(p, q);
}
else{
add_edge(q, p);
}
}
}
}
}
int dfs(int v, int t, int f){
if(v == t){
return f;
}
u[v] = true;
for(E& e: g[v]){
if(!u[e.t] && e.c > 0){
int d = dfs(e.t, t, min(f, e.c));
if(d > 0){
e.c -= d;
g[e.t][e.r].c += d;
return d;
}
}
}
return 0;
}
int max_flow(int s, int t){
int mf = 0;
while(1){
fill_n(u, n * m + 2, false);
int f = dfs(s, t, inf);
if(f == 0){
return mf;
}
mf += f;
}
}
int main(){
cin >> n >> m;
rep(i, n){
cin >> s[i];
rep(j, m){
s[i][j] = s[i][j] != '.' ? s[i][j] == 'w' : 2;
}
}
make_graph();
int k = max_flow(encode(n, 0), encode(n, 1));
int b = -k, w = -k;
rep(i, n){
rep(j, m){
if(s[i][j] == 0){
++b;
}
else if(s[i][j] == 1){
++w;
}
}
}
int l = min(b, w);
cout << k * 100 + l * 10 + (b + w - 2 * l) << endl;
return 0;
}
hipokaba