結果
問題 | No.421 しろくろチョコレート |
ユーザー |
![]() |
提出日時 | 2019-02-14 00:41:48 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 11 ms / 2,000 ms |
コード長 | 2,538 bytes |
コンパイル時間 | 850 ms |
コンパイル使用メモリ | 88,740 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-23 07:22:33 |
合計ジャッジ時間 | 2,417 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 65 |
コンパイルメッセージ
main.cpp: In function ‘void add_edge(long long int, long long int, long long int)’: main.cpp:54:47: warning: narrowing conversion of ‘G[to].std::vector<edge>::size()’ from ‘std::vector<edge>::size_type’ {aka ‘long unsigned int’} to ‘long long int’ [-Wnarrowing] 54 | G[from].push_back((edge){to,cap,G[to].size()}); | ~~~~~~~~~~^~ main.cpp:55:49: warning: narrowing conversion of ‘(G[from].std::vector<edge>::size() - 1)’ from ‘std::vector<edge>::size_type’ {aka ‘long unsigned int’} to ‘long long int’ [-Wnarrowing] 55 | G[to].push_back((edge){from,0,G[from].size()-1}); | ~~~~~~~~~~~~~~^~
ソースコード
#include<iostream>#include<algorithm>#include<cstdio>#include<cmath>#include<cctype>#include<math.h>#include<string>#include<string.h>#include<stack>#include<queue>#include<vector>#include<utility>#include<set>#include<map>#include<stdlib.h>#include<iomanip>using namespace std;#define ll long long#define ld long double#define EPS 0.0000000001#define INF 1e9#define LINF (ll)INF*INF#define MOD 1000000007#define rep(i,n) for(int i=0;i<(n);i++)#define loop(i,a,n) for(int i=a;i<(n);i++)#define all(in) in.begin(),in.end()#define shosu(x) fixed<<setprecision(x)#define int ll //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!typedef vector<int> vi;typedef vector<string> vs;typedef pair<int,int> pii;typedef vector<pii> vp;int gcd(int a, int b){if(b==0) return a;return gcd(b,a%b);}int lcm(int a, int b){return a*b/gcd(a,b);}//ford-fulkerson//O(FE)#define MAX_V 10000struct edge{ int to,cap,rev;};vector<edge> G[MAX_V];bool used[MAX_V];void add_edge(int from, int to, int cap){G[from].push_back((edge){to,cap,G[to].size()});G[to].push_back((edge){from,0,G[from].size()-1});}int dfs(int v, int t, int f){if(v == t)return f;used[v] = true;for(int i = 0; i < G[v].size(); i++){edge &e = G[v][i];if(!used[e.to] && e.cap > 0){int d = dfs(e.to,t, min(f,e.cap));if(d > 0){e.cap -= d;G[e.to][e.rev].cap += d;return d;}}}return 0;}int max_flow(int s, int t){int flow = 0;while(1){memset(used,0,sizeof(used));int f = dfs(s, t, INF);if(f == 0)return flow;flow += f;}}signed main(void) {int n,m;cin >> n >> m;vs s(n);rep(i,n)cin >> s[i];int w = 0, b = 0;int dx[] = {0,1,0,-1};int dy[] = {1,0,-1,0};rep(i,n)rep(j,m)if(s[i][j] != '.'){int from = i*m+j;if(s[i][j] == 'w')rep(k,4){int x = i + dx[k];int y = j + dy[k];if(x < 0 || x >= n || y < 0 || y >= m || s[x][y] == '.')continue;int to = x*m+y;add_edge(from+1,to+1,1);}if(s[i][j] == 'w') add_edge(0,from+1,1),w++;else add_edge(from+1,n*m+1,1),b++;}int num = max_flow(0,n*m+1);//cout << w << " " << b << " " << num << endl;int ans = num * 100;w -= num, b -= num;ans += 10 * min(w,b);ans += max(w,b) - min(w,b);cout << ans << endl;}