제출 #531654

#제출 시각아이디문제언어결과실행 시간메모리
531654Tam_theguideTracks in the Snow (BOI13_tracks)C++14
19.38 / 100
1519 ms1048580 KiB
#include <bits/stdc++.h>
using namespace std;
int n, m;
char a[4005][4005];
int belongto[4005][4005];
int component[160000005];
bool visited[4005][4005];
set<int>neighbors[4005];
bool gothere[160000005];
int source=0;
char core;
const int dx[4]={0, 0, 1, -1};
const int dy[4]={1, -1, 0, 0};
int temp=0;
deque<int>dq;
int ans=0;
int d[160000005];
bool check(int i, int j){
    if (1<=i && i<=n && 1<=j && j<=m) return true;
    else return false;
}
void floodfill(int i, int j, char cur){
    if (check(i, j)==false || visited[i][j] || a[i][j]!=cur || a[i][j]=='.') return;
    visited[i][j]=true;
    belongto[i][j]=temp;
    for (int t=0; t<4; t++){
        int u=i+dx[t];
        int v=j+dy[t];
        if (check(u, v) && belongto[u][v]!=0 && belongto[u][v]!=temp){
            neighbors[temp].insert(belongto[u][v]);
            neighbors[belongto[u][v]].insert(temp);
        }
        floodfill(u, v, cur);
    }
}
int main(){
    cin>>n>>m;
    for (int i=1;i <=n; i++){
        for (int j=1; j<=m; j++){
            cin>>a[i][j];
            if (i==1 && j==1){
                core=a[i][j];
            }

        }
    }
    for (int i=1;i <=n; i++){
        for (int j=1; j<=m; j++){
            if (visited[i][j]==false &&  a[i][j]!='.'){
                temp++;
                d[temp]=1e9;
                component[temp]=(a[i][j]!=core);
                floodfill(i, j, a[i][j]);
            }
        }
    }
  /*  for (int i=1; i<=temp; i++){
        cout<<i<<" "<<"component: "<<component[i]<<" neighbors: ";
        for (auto c:neighbors[i]){
            cout<<c<<" ";
        }
        cout<<endl;

    } */
    d[1]=1;

    dq.push_back(1);
    while (!dq.empty()){
        int x=dq.front();
        dq.pop_front();
        //cout<<"cac"<<endl;
        gothere[x]=true;
        for (auto c:neighbors[x]){
            if (gothere[c]) continue;
            if (component[c]!=component[x]){

                dq.push_back(c);
                d[c]=min(d[c], d[x]+1);
            }else{
                dq.push_front(c);
                d[c]=min(d[c], d[x]);
            }
        }
    }
    for (int i=1; i<=temp; i++){
        ans=max(ans, d[i]);
        //cout<<d[i]<<endl;
    }
    cout<<ans;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...