#Problem link:
[Practice] CENV005 Problem - CodeChef
[Codennovate] CodeChef: Practical coding for everyone
Author: [Abhishek Patnigere] stingray8041 | CodeChef User Profile for Abhishek Patnigere | CodeChef
Editorialist: [Akshat Goyal] beast787 | CodeChef User Profile for Akshat Goyal | CodeChef
DIFFICULTY: Hard
# PREREQUISITES: Graphs,Math
Solution To The Problem
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define ff first
#define ss second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define mod 1000000007
#define rep(i,n) for(int i=0; i<n; i++)
#define repa(i,start,end) for(int i=start; i<=end; i++)
#define repd(i,start,end) for(int i=start; i>=end; i–)
#define all(x) x.begin(),x.end()
#define debug(x) cout << “(” << #x << ": " << x << “)” << endl;
#define maxn 1000005
vector adj[maxn];
int udist[maxn], vdist[maxn];
void bfs(int root, int n, int distance[]) {
vector visited(n,false);
visited[root]=true;
distance[root]=0;
queue q;
q.push(root);
while(!q.empty()) {
int node = q.front();
q.pop();
for(int u: adj[node]) {
if(!visited[u]) {
visited[u] = true;
distance[u] = distance[node]+1;
q.push(u);
}
}
}
}
void solve() {
int n,m,u,v;
cin >> n >> m >> u >> v;
rep(i,m) {
int x,y;
cin >> x >> y;
adj[x].pb(y);
adj[y].pb(x);
}
if(u==v) {
cout << "possible\n";
cout << 0 << endl;
cout << u << endl;
return;
}
rep(i,n) {
if(adj[i].size()==0 || find(all(adj[i]),u)==adj[i].end() || find(all(adj[i]),v)==adj[i].end()) {
udist[i]=1e8;
vdist[i]=1e8;
}
else {
udist[i]=0;
vdist[i]=0;
}
}
bfs(u,n,udist);
bfs(v,n,vdist);
int path_length=1e8;
bool flag=0;
map<int, vector<int>> ans; //distance to node map
for(int i=0; i<n; i++) {
if(udist[i]!=1e8 && vdist[i]!=1e8) {
if(udist[i]==vdist[i]) {
flag=1;
path_length = min(path_length, udist[i]);
ans[udist[i]].pb(i);
}
else if(udist[i]>vdist[i]) {
int req = udist[i];
if( (udist[i]-vdist[i])%2 == 0) {
flag=1;
path_length = min(path_length, req);
ans[req].pb(i);
continue;
}
int parity = vdist[i]%2;
//search if path length of req from node v to i
for(int x: adj[i]) {
if(vdist[x] < req) {
if(vdist[x]%2 == parity) {
flag=1;
path_length = min(path_length, req);
ans[req].pb(i);
break;
}
}
}
}
else {
int req = vdist[i];
if( (vdist[i]-udist[i])%2 == 0) {
flag=1;
path_length = min(path_length, req);
ans[req].pb(i);
continue;
}
int parity = udist[i]%2;
//search if path length of req from node u to i
for(int x: adj[i]) {
if(udist[x] < req) {
if(udist[x]%2 == parity) {
flag=1;
path_length = min(path_length, req);
ans[req].pb(i);
break;
}
}
}
}
}
}
if(flag) {
cout << "possible" << endl;
cout << path_length << endl;
for(auto x: ans[path_length]) {
cout << x << " ";
}
cout << endl;
}
else
cout << "impossible" << endl;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
solve();
}