#include using namespace std; struct UnionFind{ int num;//連結成分の数 vector 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] P; queue

que; template void chmin(T &a,T b){ if(a>b)a=b; } signed main(){ int w,h;cin>>w>>h; UnionFind uf(w*h); vector s(h); for(int i=0;i>s[i]; int I,J; for(int i=0;i