Submission #306263


Source Code Expand

#include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <sstream>
#include <set>
#include <map>
#include <algorithm>
#include <cstdio>
#include <cstdlib>

#define rep(i,n) for(int i=0;i<(int)(n);++i)
#define iter(a) __typeof(a.begin())
#define FOR(it,a) for(iter(a)it=a.begin();it!=a.end();++it)
#define F first
#define S second
#define SZ(a) (int)((a).size())
#define sz(a) SZ(a)
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define ALL(a) (a).begin(),(a).end()
using namespace std;

typedef long long ll;
typedef pair<int,int> PI;
typedef unsigned long long ull;

#define PR(...) do{cerr << "line : " << __LINE__ << endl; pr(#__VA_ARGS__, __VA_ARGS__);}while(0);
template<class T>
void pr(const string& name, T t){
  cerr << name << ": " << t << endl;
}

template<typename T, typename ... Types>
void pr(const string& names, T t, Types ... rest) {
  auto comma_pos = names.find(',');
  cerr << names.substr(0, comma_pos) << ": " << t << ", ";
  
  auto next_name_pos = names.find_first_not_of(" \t\n", comma_pos + 1);
  pr(string(names, next_name_pos), rest ...);
}

template<class T,class U> ostream& operator<< (ostream& o, const pair<T,U>& v){return o << "(" << v.F << ", " << v.S << ")";}
template<class T> ostream& operator<< (ostream& o, const vector<T>& v){o << "{";rep(i,SZ(v)) o << (i?", ":"") << v[i];return o << "}";}

const int dx[] = {0,1,0,-1};
const int dy[] = {-1,0,1,0};
#define endl '\n'



int n,m;
string in[100];
int cost[100][100];
bool ok[100][100];

struct FlowGraphF{
  /*
    verified
    http://poj.org/problem?id=3713  <- uso kaiho de tukatta
   */
  
  struct edge{
    int to,cap,rev;
    bool revf;
    edge(int to,int cap,int rev,bool revf=false):to(to),cap(cap),rev(rev),revf(revf){};
  };
  
  vector<vector<edge> > G;
  vector<int> vis;
  
  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,true));
  }
  bool fflag;
  FlowGraphF(int V):G(V),vis(V),fflag(false){};
  char fc;
  
  int dfs(int v,int t,int f){
    if(v == t) return f;
    vis[v] = 1;
    int cx = v/2/m;
    int cy = v/2%m;
    if(v%2==0 && cx < n && cy < m){
      if(in[cx][cy]=='A') fc = 'a';
      if(in[cx][cy] == 'B') fc = 'b';
    }
    
    for(int i = 0; i < (int)G[v].size(); ++i){
      edge& e = G[v][i];
      if(e.cap > 0 && !vis[e.to]){
        int d = dfs(e.to, t, min(f, e.cap));
        if(d > 0){
          e.cap -= d;
          G[e.to][e.rev].cap += d;
          
          if(1){
            if(v + 1 == e.to && v%2==0){
              int cx = (v/2)/m;
              int cy = (v/2)%m;
              
              if(cx < n && cy < m && in[cx][cy] == '.')
                ok[cx][cy] = 1;
            }
            // else if(e.to + 1 == v && e.to%2==0){
            //   int cx = (v/2)/m;
            //   int cy = (v/2)%m;
            //   if(cx < n && cy < m){
            //     assert(false);
            //     if(in[cx][cy] == 'a') in[cx][cy] = 'b';
            //     else if(in[cx][cy] == 'b') in[cx][cy] = 'a';
            //   }
            // }
          }
          
          return d;
        }
      }
    }
    return 0;
  }
  
  int max_flow(int s, int t, int sum=-1){
    int flow = 0;
    if(sum == -1){
      sum = 0;
      for(int i = 0; i < (int)G[s].size(); ++i)
        sum += G[s][i].cap;
    }
    
    for(;sum > 0;){
      fill(vis.begin(), vis.end(), 0);
      int f = dfs(s, t, sum);
      if(f == 0) break;
      fflag = true;
      flow += f;
      sum -= f;
    }
    return flow;
  }

  void dfs2(int v,int t){
    if(v == t) return;
    int cx = v/2/m;
    int cy = v/2%m;
    if(v%2==0 && cx < n && cy < m){
      if(in[cx][cy]=='A'){
        fc = 'a';
        return;
      }
      if(in[cx][cy] == 'B'){
        fc = 'b';
        return;
      }
      
    }
    
    //PR(v);
    
    for(int i = 0; i < (int)G[v].size(); ++i){
      edge& e = G[v][i];
      if(e.revf) continue;
      if(e.cap == 0){
        int nx = e.to/2/m;
        int ny = e.to/2%m;
        dfs2(e.to, t);
        
        if(1){
          if(v + 1 == e.to && v%2==0){
            int cx = (v/2)/m;
            int cy = (v/2)%m;
            if(cx < n && cy < m && in[cx][cy] == '.')
              in[cx][cy] = fc;
          }else if(e.to + 1 == v && e.to%2==0){
            int cx = (v/2)/m;
            int cy = (v/2)%m;
            assert(false);
            if(cx < n && cy < m){
              if(in[cx][cy] == 'a') in[cx][cy] = 'b';
              else if(in[cx][cy] == 'b') in[cx][cy] = 'a';
            }
          }
        }
      }
    }
  }  
  
  void dfsfill(int source, int target){
    dfs2(source,target);
  }
};


int main(int argc, char *argv[])
{
  cin >> n >> m;
  rep(i,n) cin >> in[i];
  queue<pair<int,PI> > q;
  rep(i,n)rep(j,m){
    if(in[i][j] == 'S') q.push(mp(0,mp(i,j)));
  }

  memset(cost,-1,sizeof(cost));
  
  while(!q.empty()){
    int cc = q.front().F;
    int cx = q.front().S.F;
    int cy = q.front().S.S;
    q.pop();
    if(cost[cx][cy] != -1) continue;
    cost[cx][cy] = cc;
    
    rep(i,4){
      int nx = cx + dx[i];
      int ny = cy + dy[i];
      if(nx < 0 || nx >= n || ny < 0 || ny >= m || in[nx][ny] == '#')
        continue;
      q.push(mp(cc+1,mp(nx,ny)));
    }
  }

  FlowGraphF fg(n*m*2+10);
  int source = n*m*2;
  int target1 = source + 1;
  int target2 = target1 + 1;
  int target = target2+1;
  
  fg.add_edge(target1,target,1);
  fg.add_edge(target2,target,1);
  vector<int> nidx(n);
  vector<int> midx(m);
  rep(i,n) nidx[i] = i;
  rep(j,m) midx[j] = j;

  srand(time(NULL));
  random_shuffle(ALL(nidx));
  random_shuffle(ALL(midx));
  
  //rep(i,n){
  for(auto i : nidx){
    random_shuffle(ALL(midx));
    for(auto j : midx){
      //rep(j,m){
      int inidx = (i*m+j)*2;
      int outidx = inidx + 1;
      if(in[i][j] == '#') continue;
      if(in[i][j] == 'S'){
        fg.add_edge(source,outidx,2);
      }
      if(in[i][j] == 'A'){
        fg.add_edge(outidx,target1,1);
      }
      if(in[i][j] == 'B'){
        fg.add_edge(outidx,target2,1);
      }
      fg.add_edge(inidx,outidx,1);
      
      rep(k,4){
        int nx = i + dx[k];
        int ny = j + dy[k];
        if(nx < 0 || nx >= n || ny < 0 || ny >= m || in[nx][ny] == '#')
          continue;
        if(cost[i][j] + 1 != cost[nx][ny]) continue;
        int inidxk = (nx*m+ny)*2;
        int outidxk = inidxk + 1;
        fg.add_edge(outidx,inidxk,1);
      }
    }
  }
  
  int fl = fg.max_flow(source,target) ;
  
  if(fl < 2){
    cout << "NA" << endl;
    return 0;
  }

  
  fg.dfsfill(source,target);
  rep(i,n) cout << in[i] << endl;
}

Submission Info

Submission Time
Task D - Maze
User atetubou
Language C++11 (GCC 4.8.1)
Score 100
Code Size 6973 Byte
Status AC
Exec Time 31 ms
Memory 1436 KB

Judge Result

Set Name all
Score / Max Score 100 / 100
Status
AC × 41
Set Name Test Cases
all manual_j1.txt, manual_j10.txt, manual_j11.txt, manual_j12.txt, manual_j13.txt, manual_j14.txt, manual_j15.txt, manual_j2.txt, manual_j3.txt, manual_j4.txt, manual_j5.txt, manual_j6.txt, manual_j7.txt, manual_j8.txt, manual_j9.txt, manual_k1.txt, manual_k2.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_max_01.txt, random_max_02.txt, random_max_03.txt, random_max_04.txt, random_max_05.txt, random_max_06.txt, random_max_07.txt, random_max_08.txt, random_max_09.txt, random_max_10.txt, sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, white_01.txt, white_02.txt, white_03.txt, white_04.txt
Case Name Status Exec Time Memory
manual_j1.txt AC 26 ms 920 KB
manual_j10.txt AC 25 ms 856 KB
manual_j11.txt AC 27 ms 1368 KB
manual_j12.txt AC 25 ms 916 KB
manual_j13.txt AC 25 ms 916 KB
manual_j14.txt AC 25 ms 924 KB
manual_j15.txt AC 24 ms 928 KB
manual_j2.txt AC 27 ms 1432 KB
manual_j3.txt AC 25 ms 924 KB
manual_j4.txt AC 24 ms 924 KB
manual_j5.txt AC 25 ms 924 KB
manual_j6.txt AC 24 ms 920 KB
manual_j7.txt AC 24 ms 920 KB
manual_j8.txt AC 24 ms 920 KB
manual_j9.txt AC 24 ms 924 KB
manual_k1.txt AC 28 ms 1372 KB
manual_k2.txt AC 26 ms 1436 KB
random_01.txt AC 26 ms 1244 KB
random_02.txt AC 26 ms 1244 KB
random_03.txt AC 26 ms 1176 KB
random_04.txt AC 26 ms 1184 KB
random_05.txt AC 25 ms 1092 KB
random_06.txt AC 25 ms 1116 KB
random_max_01.txt AC 27 ms 1436 KB
random_max_02.txt AC 31 ms 1428 KB
random_max_03.txt AC 28 ms 1372 KB
random_max_04.txt AC 29 ms 1364 KB
random_max_05.txt AC 31 ms 1300 KB
random_max_06.txt AC 27 ms 1300 KB
random_max_07.txt AC 28 ms 1240 KB
random_max_08.txt AC 30 ms 1304 KB
random_max_09.txt AC 28 ms 1244 KB
random_max_10.txt AC 25 ms 1240 KB
sample_01.txt AC 24 ms 920 KB
sample_02.txt AC 26 ms 920 KB
sample_03.txt AC 25 ms 924 KB
sample_04.txt AC 23 ms 924 KB
white_01.txt AC 29 ms 1368 KB
white_02.txt AC 28 ms 1372 KB
white_03.txt AC 27 ms 1364 KB
white_04.txt AC 30 ms 1428 KB