#include <bits/stdc++.h>
using
namespace
std;
#define INF 0x3f3f3f3f
class
Graph
{
int
V;
list<pair<
int
,
int
>> *graph;
public
:
Graph(
int
V)
{
this
->V = V;
graph =
new
list<pair<
int
,
int
>>[V];
}
void
addEdge(
int
u,
int
v,
int
w)
{
graph[u].push_back(make_pair(v, w));
}
vector<
int
> shortestPath(
int
source)
{
set<pair<
int
,
int
>> setds;
vector<
int
> distance(V, INF);
setds.insert(make_pair(0, source));
distance = 0;
while
(!setds.empty())
{
pair<
int
,
int
> tmp = *(setds.begin());
setds.erase(setds.begin());
int
u = tmp.second;
list<pair<
int
,
int
>>::iterator i;
for
(i = graph[u].begin(); i != graph[u].end(); ++i)
{
int
v = (*i).first;
int
weight = (*i).second;
if
(distance[v] > distance[u] + weight)
{
if
(distance[v] != INF)
setds.erase(setds.find(make_pair(distance[v], v)));
distance[v] = distance[u] + weight;
setds.insert(make_pair(distance[v], v));
}
}
}
return
distance;
}
Graph modelGraphWithEdgeWeight(
int
edge[][2],
int
E,
int
V)
{
Graph g(V);
for
(
int
i = 0; i < E; i++)
{
g.addEdge(edge[i][0], edge[i][1], 0);
g.addEdge(edge[i][1], edge[i][0], 1);
}
return
g;
}
int
getMinEdgeReversal(
int
edge[][2],
int
E,
int
V,
int
source,
int
destination)
{
Graph g = modelGraphWithEdgeWeight(edge, E, V);
vector<
int
> dist = g.shortestPath(source);
if
(dist[destination] == INF)
return
-1;
else
return
dist[destination];
}
};
int
main()
{
int
V = 7;
Graph g(V);
int
edge[][2] = {{0, 1}, {2, 1}, {2, 3}, {5, 1}, {4, 5}, {6, 4}, {6, 3}};
int
E =
sizeof
(edge) /
sizeof
(edge[0]);
int
minEdgeToReverse = g.getMinEdgeReversal(edge, E, V, 0, 6);
if
(minEdgeToReverse != -1)
cout << minEdgeToReverse << endl;
else
cout <<
"Not Possible."
<< endl;
return
0;
}