結果

問題 No.421 しろくろチョコレート
ユーザー hipokabahipokaba
提出日時 2016-09-12 02:03:03
言語 C++11
(gcc 11.4.0)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,764 bytes
コンパイル時間 552 ms
コンパイル使用メモリ 53,528 KB
最終ジャッジ日時 2023-09-07 01:39:20
合計ジャッジ時間 2,040 ms
ジャッジサーバーID
(参考情報)
judge12 / judge14
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
main.cpp:16:1: error: ‘vector’ does not name a type; did you mean ‘perror’?
 vector<E> g[2502];
 ^~~~~~
 perror
main.cpp: In function ‘void add_edge(int, int)’:
main.cpp:24:2: error: ‘g’ was not declared in this scope
  g[f].push_back({t, 1, (int)g[t].size()});
  ^
main.cpp: In function ‘int dfs(int, int, int)’:
main.cpp:64:12: error: ‘g’ was not declared in this scope
  for(E& e: g[v]){
            ^

ソースコード

diff #

#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;
}
0