#include <bits/stdc++.h>
using
namespace
std;
class
Graph {
int
V;
list<
int
>* adj;
void
minEdgeDFSUtil(vector<
bool
>& visited,
int
src,
int
des,
int
& min_num_of_edges,
int
& edge_count);
public
:
Graph(
int
V);
void
addEdge(
int
src,
int
des);
void
minEdgeDFS(
int
u,
int
v);
};
Graph::Graph(
int
V)
{
this
->V = V;
adj =
new
list<
int
>[V];
}
void
Graph::addEdge(
int
src,
int
des)
{
adj[src].push_back(des);
adj[des].push_back(src);
}
void
Graph::minEdgeDFSUtil(vector<
bool
>& visited,
int
src,
int
des,
int
& min_num_of_edges,
int
& edge_count)
{
visited[src] =
true
;
if
(src == des) {
if
(min_num_of_edges > edge_count)
min_num_of_edges = edge_count;
}
else
{
list<
int
>::iterator i;
for
(i = adj[src].begin(); i != adj[src].end(); i++) {
int
v = *i;
if
(!visited[v]) {
edge_count++;
minEdgeDFSUtil(visited, v, des, min_num_of_edges,
edge_count);
}
}
}
visited[src] =
false
;
edge_count--;
}
void
Graph::minEdgeDFS(
int
u,
int
v)
{
vector<
bool
> visited(V,
false
);
int
min_num_of_edges = INT_MAX;
int
edge_count = 0;
minEdgeDFSUtil(visited, u, v, min_num_of_edges,
edge_count);
cout << min_num_of_edges;
}
int
main()
{
Graph g(5);
g.addEdge(0, 1);
g.addEdge(0, 4);
g.addEdge(1, 2);
g.addEdge(2, 4);
g.addEdge(2, 3);
g.addEdge(3, 4);
int
u = 0;
int
v = 3;
g.minEdgeDFS(u, v);
return
0;
}