#include using namespace std; typedef long long ll; typedef pair P; struct unionfind{ int par[400010]; // 親ノード 必要に応じて要素数を変えよう int rank[400010]; // ランク 必要に応じて要素数を変えよう int w[400010]; unionfind(int n){ init(n); } void init(int n){ for(int i=0;i<=n;i++){ par[i]=i; rank[i]=1; w[i]=0; } } int root(int x) { if (par[x] == x) { return x; } else { return par[x] = root(par[x]); } } int size(int x){ return rank[root(x)]; } bool same(int x,int y) { return root(x) == root(y); } void unite(int x,int y) { x=root(x); y=root(y); if(x==y){ w[x]++; return; } if(rank[x]> n >> m >> s >> t; s--,t--; vector p(n); unionfind tree(n); for(i=0;i> p[i]; } vector > g(n); for(i=0;i> a >> b; a--,b--; tree.unite(a,b); g[a].push_back(b); g[b].push_back(a); } vector ds(n,-INF),ns(n,0); ds[s]=0,ns[s]=1; priority_queue,greater

> que; que.push(P(0,s)); while(!que.empty()){ P p1=que.top(); que.pop(); ll u=p1.first,v=p1.second; if(ds[v]!=u){ continue; } for(i=0;ip[us]){ if(ds[us]