#include <bits/stdc++.h>
using namespace std;
class Graph{
public:
int V;
int E;
vector<int> *adj;
Graph(int num_vertices, int num_edges){
this->V = num_vertices;
this->E = num_edges;
this->adj = new vector<int>[num_vertices];
}
void addEdge(int u, int v){
adj[u-1].push_back(v-1);
adj[v-1].push_back(u-1);
}
void computeAllPaths(int src, int dest, vector<int> &path, vector<bool> &vis, vector<vector<int>> &paths){
if(vis[src]){
return ;
}
if(src == dest){
path.push_back(src);
paths.push_back(path);
path.pop_back();
return;
}
vis[src] = 1;
path.push_back(src);
for(int node: this->adj[src]){
if(!vis[node]){
computeAllPaths(node, dest, path, vis, paths);
}
}
vis[src] = 0;
path.pop_back();
}
void ShortestPath(int src, int dest){
vector<int> path;
vector<bool> vis(V, 0);
vector<vector<int>> paths;
computeAllPaths(src, dest, path, vis, paths);
vector<int> Shortest_path;
for(vector<int> v: paths){
if(Shortest_path.size()==0 or (Shortest_path.size()>v.size())){
Shortest_path = v;
}
}
cout<<"The Shortest Path of the Unweighted Graph is: ";
for(int i=0;i<Shortest_path.size();++i){
if(i!=Shortest_path.size()-1){
cout<<Shortest_path[i]+1<<" -> ";
}else{
cout<<Shortest_path[i]+1<<'\n';
}
}
cout<<"The length is "<<Shortest_path.size();
}
};
int main() {
int num_vertices = 8;
int num_edges = 9;
Graph G(num_vertices, num_edges);
G.addEdge(1, 2);
G.addEdge(2, 1);
G.addEdge(1, 3);
G.addEdge(3, 1);
G.addEdge(1, 4);
G.addEdge(4, 1);
G.addEdge(3, 8);
G.addEdge(8, 3);
G.addEdge(5, 2);
G.addEdge(2, 5);
G.addEdge(4, 6);
G.addEdge(6, 4);
G.addEdge(7, 6);
G.addEdge(6, 7);
G.addEdge(5, 8);
G.addEdge(8, 5);
G.addEdge(8, 7);
G.addEdge(7, 8);
int src = 1; int dest = 8;
G.ShortestPath(src-1, dest-1);
return 0;
}