結果
| 問題 |
No.157 2つの空洞
|
| コンテスト | |
| ユーザー |
cureskol
|
| 提出日時 | 2020-04-09 11:19:45 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 2,015 bytes |
| コンパイル時間 | 1,888 ms |
| コンパイル使用メモリ | 180,020 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-22 07:45:16 |
| 合計ジャッジ時間 | 2,628 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 16 |
コンパイルメッセージ
main.cpp: In function 'int main()':
main.cpp:73:22: warning: 'J' may be used uninitialized [-Wmaybe-uninitialized]
73 | if(!uf.same(i*w+j,I*w+J))continue;
| ~~~~~~~^~~~~~~~~~~~~
main.cpp:49:9: note: 'J' was declared here
49 | int I,J;
| ^
main.cpp:73:30: warning: 'I' may be used uninitialized [-Wmaybe-uninitialized]
73 | if(!uf.same(i*w+j,I*w+J))continue;
| ~^~
main.cpp:49:7: note: 'I' was declared here
49 | int I,J;
| ^
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct UnionFind{
int num;//連結成分の数
vector<int> r,p;//そのグループのサイズ,自分の親っぽいやつ
UnionFind(){}
UnionFind(int n):num(n),r(n,1),p(n,0){iota(p.begin(),p.end(),0);}
int find(int x){//どのグループに所属するか
return (x==p[x]?x:p[x]=find(p[x]));//xがグループの名前と一致するまでxを親にする
}
bool same(int x,int y){//同じグループかどうか
return find(x)==find(y);
}
void unite(int x,int y){//xとyを同じグループにする
x=find(x);y=find(y);//xとyのグループの名前をどっちかが変える
if(x==y) return;
if(r[x]<r[y]) swap(x,y);//サイズが大きい方をxとする
r[x]+=r[y];//yの親をxにする(今までyだったグループ名がxになる)
p[y]=x;
num--;
}
int size(int x){//グループの大きさ
return r[find(x)];
}
int count() const{//グループの数
return num;
}
};
int ans=1e9;
int dy[4]={-1,1,0,0},dx[4]={0,0,-1,1};
typedef pair<int,int> P;
queue<P> que;
template<typename T>
void chmin(T &a,T b){
if(a>b)a=b;
}
signed main(){
int w,h;cin>>w>>h;
UnionFind uf(w*h);
vector<string> s(h);
for(int i=0;i<h;i++)cin>>s[i];
int I,J;
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
if(s[i][j]=='.'){
que.push(P(i,j));I=i;J=j;
i=j=1e9;
}
while(que.size()){
P p=que.front();que.pop();
int y=p.first,x=p.second;
for(int i=0;i<4;i++){
int Y=dy[i]+y,X=dx[i]+x;
if(s[Y][X]=='.'&&!uf.same(Y*w+X,y*w+x)){
uf.unite(Y*w+X,y*w+x);
que.push(P(Y,X));
}
}
}
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
for(int k=0;k<h;k++){
for(int l=0;l<w;l++){
if(uf.same(i*w+j,k*w+l))continue;
if(s[i][j]!='.'||s[k][l]!='.')continue;
if(!uf.same(i*w+j,I*w+J))continue;
chmin(ans,abs(i-k)+abs(j-l));
}
}
}
}
cout<<ans-1<<endl;
}
cureskol